ERLEDIGT
JA
JA
ANTWORTEN
12
12
ZUGRIFFE
890
890
EMPFEHLEN
-
02.08.06 23:42 #1
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
-
03.08.06 07:31 #2
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
-
03.08.06 09:22 #3
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
-
03.08.06 09:48 #4
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...
-
03.08.06 13:29 #5
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.jpgGeändert von LuckyProgger (03.08.06 um 14:06 Uhr)
-
03.08.06 14:06 #6
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
-
03.08.06 14:18 #7
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.
-
03.08.06 15:56 #8
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 .
des hört sich ganz gut an. werd mal probieren ob ich des hinbekomm und ob des dann läuft.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.
hoffe des war ausführlich wenn nich. versuch ichs nochmal
-
03.08.06 16:01 #9
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
-
03.08.06 20:07 #10
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
-
04.08.06 08:32 #11
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
ToDuRächtschreipfehlersindarbeitsplätzbedungt.
-
04.08.06 09:39 #12
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
-
04.08.06 21:04 #13
Rookie
- Registriert seit
- Aug 2006
- Beiträge
- 6
OkiDoki,
hat geklappt, jetz läuft´s. danke für eure hilfe
Ähnliche Themen
-
Multithread Programmierung
Von Perdan im Forum C/C++Antworten: 9Letzter Beitrag: 10.11.09, 12:09 -
Multithread TCP Server
Von Psychomentis im Forum .NET Web und KommunikationAntworten: 2Letzter Beitrag: 17.10.09, 20:15 -
MFC Multithread & this Zeiger
Von JoachimJogi im Forum VisualStudio & MFCAntworten: 0Letzter Beitrag: 27.06.07, 18:07 -
Problem: Flash MX (7.1) exportiert meine Fla nicht mehr - dringendes Problem
Von Lukasz im Forum Flash PlattformAntworten: 4Letzter Beitrag: 22.03.06, 20:50 -
Multithread Problem
Von CodeFatal im Forum C/C++Antworten: 7Letzter Beitrag: 10.01.06, 12:45




Zitieren
Login
