1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Multithread problem

Dieses Thema im Forum "C/C++" wurde erstellt von LuckyProgger, 2. August 2006.

  1. LuckyProgger

    LuckyProgger Grünschnabel

    Hi,
    hab folgendes problem: Ich hab eine Dialog anwendung mit einer listbox(kleiner chat). ich hab neben dem dialog einen thread laufen um nachrichten abzufangen und in der listbox anzuzeigen. nur geht des nicht. wenn ich aus dem thread direkt die nachricht ausgeben will kommt ein fehler.
    und jetzt weis ich nicht weiter. vllt kann mir hier einer helfen bzw denkhilfe leisten um das problem zu umgehen

    danke
  2. ToDu

    ToDu Grünschnabel

    Moin,

    was für ein Fehler erhälst du und wie willste auf die ListBox zugreifen. Haste es schon trocken, also ohne Thread versucht?




    Mfg
    ToDu
  3. GABehnke

    GABehnke Grünschnabel

    Tut mir leid, mit einer solchen Frage kann man absolut nichts anfangen.
    Siehe bitte am Anfang der Themen die Hinweise:
    Die richtige Frage
    Angaben bei Fragen zu Fensteranwendungen.

    Vorab:
    Sollte es sich um eine WIndowsanwendung handeln bedenke, dass z.B. Windowsmessages nur abgefangen werden können, wenn der Thread über eine entsprechende Messagequeue verfügt, also mit anderen Worten ein Window ist. Für den Zugriff auf Elemente eines anderen Threads gibt es verschiedene Möglichkeiten. Im einfachsten Fall reicht die CriticalSection aus.
    Aber wie gesagt ohne nähere Angaben was Du mit welchen Mitteln (OS, Compiler) machen willst, ist es nicht möglich genauere Tips zu geben

    Gruß
    Gerhard
  4. Christian Kusmanow

    Christian Kusmanow Erfahrenes Mitglied

    Hi!

    Erstmal muss ich anmerken das ich kein cpp mach. Dafür aber c# und das schon Jahre lang.
    Für mich schaut das so aus, als möchtest Du auf ein Control zugreifen das in einem anderen Thread erstellt wurde.
    Bei mir ist das nicht möglich. Es entstehen dabei Deathlocks.
    Ich muss dafür die Methode, in der ich auf das Control zugreife,
    auf dem Thread invoken in dem das Control erstellt wurde.
    Dafür benötige ich lediglich ich einen delegate dessen Sigantur der Methode entspricht.

    Hoffe ich konnte helfen...
  5. LuckyProgger

    LuckyProgger Grünschnabel

    Also:
    im dialog befindet sich die listbox. neben dem dialog starte ich dann einen thread mit der funktion um nachrichten zu empfangen. aus diesem thread will ich die nachricht dann in dem dialog ausgeben. benutze einen worker-thread. kann des vllt daran liegen ?

    Habs auch grade mit einem user-interface thread probiert. geht auch nich. folgender fehler kommt dann immer:
    http://people.freenet.de/bilder500/fehler.jpg
    Zuletzt bearbeitet: 3. August 2006
  6. GABehnke

    GABehnke Grünschnabel

    Du hälts Dich ja ganz schön zurück mit Infos:
    Also:
    1.) Was für Nachrichten möchtest Du abfangen
    2.) Ist dieses mit Deinem Thread auch möglich
    3.) Wie gibst Du die "Nachricht" aus
    4.) Was für einen Fehler erhältst Du
    Ansonsten folgender Tip:
    1.)Übergebe Deinem Thread das Handle Deines Dialoges
    2.)Mit z.B.
    CString * csMessages = new CString();
    PostMessage(handle,WM_ADDMESSAGE, 0, (LPARAM)s;
    kannst Du Deinem Dialog die Message schicken und in die Listbox eintragen.
    WM_ADDMESSAGE wäre in diesem Fall eine user defined messages und natürlich musst Du in Deinem Dialog ein entsprechenden Handler einbauen.

    Gruß
    Gerhard
  7. ToDu

    ToDu Grünschnabel

    So,

    deine Infos sind bissl karg aber schau mer mal.. Also der Workerthread sollte richtig sein aber die Frage ist wie willst du auf das Listelement zugreifen Versuch einfach mal beim starten des Threads als hwnd this zu übergeben. In dem Thread castest du pParam und hast ein Zeigerlein auf dein Dialog. Dann kannste versuchen das Listelement zu manipulieren. Genrell solltest du einfach ein haufen Breakpoints setzen um genau lokalisieren zu können wo es scheppert.



    MFG
    ToDu

    P.s. Rächtschreibfehlersindarbeitsplatzbedingt.
  8. LuckyProgger

    LuckyProgger Grünschnabel

    ok dann mach ich mal eine, hoffe diesmal, ausführliche fehler beschreibung

    ich hab einen Chat geschrieben der nur netzwerkintern geht. in dem thread läuft die funktion um eine textnachricht von einem anderen user zu empfangen (CString nachricht).
    und diese CString nachricht will ich dann im dialog bzw der listbox ausgeben.
    hier is der fehler der auftauch und dann stürzt das prog ab http://people.freenet.de/bilder500/fehler.jpg .
    des hört sich ganz gut an. werd mal probieren ob ich des hinbekomm und ob des dann läuft.
    hoffe des war ausführlich wenn nich. versuch ichs nochmal
  9. GABehnke

    GABehnke Grünschnabel

    Na, dann müsste es mit PostMessage und der Usermessage eigenlicht prima klappen

    Gruß
    Gerhard
  10. LuckyProgger

    LuckyProgger Grünschnabel

    gut. nun ein weiteres kleines problem: theorie hab ich verstanden, nur bin ich nicht fähig des umzusetzen. vllt kannst du mir n bissl genauer helfen.
    meine dialog klasse heist: CChatDlg
    mein thread: UINT Threadproc(LPVOID param)

    zum starten mach ich:
    AfxBeginThread(Threadproc,&obj.a);

    wie benutze ich jetz PostMessage(...) damit ich vom thread an den dialog eine nachricht schicken kann z.b. WM_THREADMESSAGE ?

    und wo mach ich was hin. hoffe ihr habt noch ein wenig geduld mit mir.
    danke
  11. ToDu

    ToDu Grünschnabel

    Moin,

    versuch mal ::postMessage((HWND)pParam,WM_YOURMESSAGE,WPARAM,LPARAM).
    Du solltest beim starten des Threads natürlich das HWND deines Dialoges übergeben sonst wird das nichts.


    Mfg
    ToDu
  12. GABehnke

    GABehnke Grünschnabel

    Fangen wir mit dem Thread an:

    Du übergibst ja schon einen Zeiger auf einen Parameter (&obj.a)
    Ich weiß nicht, was in obj alles enthalten ist, sollte das handle Deines Fenster nicht enthalten sein füge es hinzu.
    Bsp.
    typdef struct
    {
    HWND hwnd;
    ......... // Deine anderen Paramter
    .........

    }OBJ, *POBJ;

    Daraus erzeugst Du sicherlich irgendwo in Deinem Programm eine Variable diesen Types
    z.B.
    static OBJ obj;

    Bevor Du den Thread erzeugst, initalisierst Du die Werte in diesem struct
    Für das Handle also so:
    obj.hwnd = hwnd;

    Deinen Thread rufst Du nun auf mit:
    AfxeginThread(Threadproc,&OBJ)

    In Deinem Thread "Threadproc" legst Du nun z.B. einen Zeiger auf OBJ
    also:
    void Threadproc(PVOID pvoid)
    {
    POBJ obj;
    obj = (POBJ)pvoid;
    oder mit C++
    pobj = static_cast<POBJ>(pvoid);
    an.
    Natürlich kannst Du auch eine Variable innerhalb Deines Threads des Types OBJ anlegen und die Werte mit den übergebenen Daten füllen. Hier hast Du ja diese Varibale statisch angelegt und "nur" einen Zeiger auf diese Varibale. Das hat allerdings den Vorteil, dass Dein Thread oder auch mehrere Threads diese Werte verändern können (natürlich durch entsprechende Synchronisationsmassnahmen) und Dein Hauptthread mit diesen veränderten Werten arbeiten kann.
    Nun kannst Du auf das Handle mit obj->hwnd zugreifen und die Messages wie bereits erwähnt absenden:
    PostMessage(obj->hwnd,WM_ADDMESSAGE,0,(LPARAM)s);
    }

    So nun zum Hauptprogramm, hier müssen nun noch eine USER MESSGAGES erzeugen
    Dieses geht ganz einfach mit

    #define WM_ADDMESSAGE WM_USER + 100

    Da ich mich mit den MFC nicht mehr so gut auskenne, die WndProc in der klassischen Art. Die MFC bietet hier aber entsprechende Macros zur Erzeugung von Messagehandler an, die auf USER Defined Messages reagieren. Da müsstest Du mal in die Unterlagen schauen
    In der WndProc kannst Du dann mit
    LRESULT CALLBACK WndProc(HWND hwnd,UINT message, WPARAM wParam,LPARAM lParam)
    {
    switch (message)
    {
    case WM_ADDMESSAGE:
    //Add (CString*)lparam in Deine MessageBox
    return NULL;

    case WM_.....
    usw.
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
    }

    Gruß
    Gerhard
  13. LuckyProgger

    LuckyProgger Grünschnabel

    OkiDoki,

    hat geklappt, jetz läuft´s. danke für eure hilfe

Diese Seite empfehlen