Daten von laufendem Thread in Editfeld schreiben?



  • Irgendwie scheint der Fall aber klar: Der Bezeichner hIP ist nicht deklariert. Hast Du irgendwo eine Zeile, die etwa so aussieht?

    HWND hIP;

    Falls nicht, solltest Du sie einfügen.



  • Du musst das HWND des Editfeldes an Deinen Thread übergeben, damit er drauf zugreifen kann...



  • hi,

    ich habe gleich in wndproc stehen:

    static HWND hIP;
    

    wie übergebe ich das an den thread?



  • bei Createthread kannst du einen user-parameter mit angeben, da kannst du das handle mitgeben. Wenn du mehrere daten übergeben willst, empfiehlt es sich , eine struktur zu machen und diese Struktur als zeiger zu übeergeben



  • wie wäre die syntax dafür?



  • So zum Beispiel:

    struct SDeineDaten
    {
        HWND hWndDest;
        std::string strInfo;
        // usw. ...
    };
    

    Dann so (o.ä.) starten:

    HANDLE       hThread;
    DWORD        dwThreadID;
    SDeineDaten  ddThreadData;
    
    // ddThreadData-Struktur-Objekt initialisieren:
    ddThreadData.hWndDest = ...;
    // ...
    
    hThread = CreateThread(NULL, 0L, ThreadProc, reinterpret_cast<void*>(&ddThreadData), 0L, &dwThreadID);
    

    Der Parameter lpParam der Thread-Prozedur enthält dann eine Adresse auf deine Datenstruktur:

    DWORD WINAPI ThreadProc(
      LPVOID lpParameter   // -> Zeiger auf ddThreadData
    );
    


  • ok danke!

    ich versuch es mal 🙂



  • hallihallo nochmal,

    ich habs grad versucht, aber ich muß zugeben ich bin nicht durchgestiegen, sorry!

    liegt vermutlich daran, daß ich noch nicht soooviel programmiererfahrung habe und bisher mit strukturen nicht gearbeitet habe. windowsprogrammierung und multithreading ist auch noch sehr neu für mich...

    ich hab hier zwar das buch von charles petzold, da ist das auch erklärt, aber leider nicht so wie ich es gebrauchen kann...

    vielleicht kann mir ja noch jemand bissel genauer erklären, wie das funktioniert mit dem übergeben?

    ich lege den thread mit dem makro "_beginthread(VerbindungsThread, 0, NULL)" an, kann ich das beibehalten?

    @codefinder: wofür steht das "HWND hWndDest" in deinem code?
    was macht das "reinterpret_cast<void*>(&ddThreadData)"?

    nichtsdestotrotz bin dich für die bisher erhaltene hilfe dankbar!

    vielleicht kann ja einer mal irgendein funktionierendes beispiel posten wenn möglich, dann ist das für mich vielleicht auch leichter verständlich. danke schonmal!

    grüße



  • Firestarter81 schrieb:

    @codefinder: wofür steht das "HWND hWndDest" in deinem code?
    was macht das "reinterpret_cast<void*>(&ddThreadData)"?

    hWndDest ist der Fensterhandle deines Edit-Cointrols. Der wird deinem Thread übergeben.
    Ein reinterpret_cast<Typ>(Ausdruck) ist eine explizite Typenumwandlung von Zeigern. Er entspricht dem C-Cast:

    (void*)&ddThreadData
    

    Das ist äquvalent.

    Firestarter81 schrieb:

    ich lege den thread mit dem makro "_beginthread(VerbindungsThread, 0, NULL)" an, kann ich das beibehalten?

    Also du kannst der CTR-Funktion _beginthread mehrere Parameter übergeben. Das ist hier wegen dem, Struct überflüssig...machs einfach so:

    struct SDeineDaten
    {
        HWND hWndEdit;
        // Weitere Daten...
    };
    // ...
    HANDLE       hThread;
    DWORD        dwThreadID;
    SDeineDaten  ddThreadData;
    
    // ddThreadData-Struktur-Objekt initialisieren:
    ddThreadData.hWndEdit = ...;
    // ...
    // Thread starten:
    hThread = CreateThread(NULL, 0L, VerbindungsThread, reinterpret_cast<void*>(&ddThreadData), 0L, &dwThreadID);
    
    // Definition der Thread-Proc (VerbindungsThread):
    DWORD WINAPI VerbindungsThread(PVOID lpParam)
    {
      // zum Beispiel Text ermitteln:
      TCHAR szBuffer[500]; // nur statisch, da übersichtlicher
      GetWindowText(reinterpret_cast<SDeineDaten*>(lpParam)->hWndEdit, szBuffer, 
                    sizeof(szBuffer) / sizeof(TCHAR));
      MessageBox(GetParent(reinterpret_cast<SDeineDaten*>(lpParam)->hWndEdit), szBuffer, TEXT("Info"), 0);
      return (EXIT_SUCCESS);
    }
    

    Hier nochmal n Beispiel: ClickMe



  • Firestarter81 schrieb:

    ich lege den thread mit dem makro "_beginthread(VerbindungsThread, 0, NULL)" an, kann ich das beibehalten?

    kannst du. da wo die NULL steht packste deinen pointer oder das HWND rein.
    beispiel:

    void VerbindungsThread (void *p)
    {
       printf ("hallo: %s", p);
    }
    
    void main()
    {
       _beginthread (VerbindungsThread, 0, "<hier irgendwas eintragen>");
       Sleep (INFINITE);
    }
    

Anmelden zum Antworten