ERLEDIGT
JA
ANTWORTEN
12
ZUGRIFFE
1028
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    LuckyProgger ist offline Rookie
    Registriert seit
    Aug 2006
    Beiträge
    6
    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. #2
    Avatar von ToDu
    ToDu ist offline Mitglied Bronze
    Registriert seit
    Apr 2006
    Beiträge
    30
    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. #3
    GABehnke ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Ort
    Hamburg
    Beiträge
    38
    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. #4
    Avatar von Christian Kusmanow
    Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.176
    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...
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  5. #5
    LuckyProgger ist offline Rookie
    Registriert seit
    Aug 2006
    Beiträge
    6
    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
    Geändert von LuckyProgger (03.08.06 um 14:06 Uhr)
     

  6. #6
    GABehnke ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Ort
    Hamburg
    Beiträge
    38
    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. #7
    Avatar von ToDu
    ToDu ist offline Mitglied Bronze
    Registriert seit
    Apr 2006
    Beiträge
    30
    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. #8
    LuckyProgger ist offline Rookie
    Registriert seit
    Aug 2006
    Beiträge
    6
    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 .
    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.
    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. #9
    GABehnke ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Ort
    Hamburg
    Beiträge
    38
    Na, dann müsste es mit PostMessage und der Usermessage eigenlicht prima klappen

    Gruß
    Gerhard
     

  10. #10
    LuckyProgger ist offline Rookie
    Registriert seit
    Aug 2006
    Beiträge
    6
    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. #11
    Avatar von ToDu
    ToDu ist offline Mitglied Bronze
    Registriert seit
    Apr 2006
    Beiträge
    30
    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
     
    Rächtschreipfehlersindarbeitsplätzbedungt.

  12. #12
    GABehnke ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Ort
    Hamburg
    Beiträge
    38
    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. #13
    LuckyProgger ist offline Rookie
    Registriert seit
    Aug 2006
    Beiträge
    6
    OkiDoki,

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

Ähnliche Themen

  1. Multithread Programmierung
    Von Perdan im Forum C/C++
    Antworten: 9
    Letzter Beitrag: 10.11.09, 12:09
  2. Multithread TCP Server
    Von Psychomentis im Forum .NET Web und Kommunikation
    Antworten: 2
    Letzter Beitrag: 17.10.09, 20:15
  3. MFC Multithread & this Zeiger
    Von JoachimJogi im Forum VisualStudio & MFC
    Antworten: 0
    Letzter Beitrag: 27.06.07, 18:07
  4. Antworten: 4
    Letzter Beitrag: 22.03.06, 20:50
  5. Multithread Problem
    Von CodeFatal im Forum C/C++
    Antworten: 7
    Letzter Beitrag: 10.01.06, 12:45