Fenster akualisieren aus while schleife
-
Guten Tag,
ich habe eine server geschrieben der in einem thread verbindungen animmt und in einem andern thread mit ihnen kommuniziert!
der aufruf sieht so aus:
void CEmpfaengerDlg::OnBnClickedButton4() { int test=0; NA=new Netzwerkarbeit(getPort()); listtemp=NA->initlisten(); Fehlerausgabe(test); DWORD nThreadID; CreateThread(0,0,ReconnectHandler, (void*)listtemp,0,&nThreadID); machwas.InsertString(0,"blubb"); for(;;) { NA->myinita(); Invalidate(); Sleep(200); } }so nun bleibt mein fenster leider hängen!
wird das mit Invalidate(); nicht neu gezeichnet?
Oder was muss ich machen damit mein fenster nicht hängen bleibt?
-
Invalidate() bewirkt erstmal nur, daß dein Dialogfenster als "neu zu zeichnen" eingestuft wird. Das Zeichnen selber passiert, wenn bei nächster Gelegenheit die WM_PAINT Nachricht abgearbeitet wird - und das passiert definitiv erst, nachdem deine OnBnClickedButton4() zurückgekehrt ist (dank der unauffälligen Endlosschleife also nie). Du solltest also die Arbeit, die in der Schleife passieren soll, in einen eigenen Thread auslagern (dann muß sich das Hauptprogramm nicht mehr damit befassen und kann sich wieder um die Darstellung kümmern) oder einen Timer anlegen.
-
Das war genau die Information die ich hören wollte

Ok, ich hab das nun in nem andern Thread, aber wie greife ich von dem Thread auf meine listbox zu?
-
Du kannst der ListBox Nachrichten schicken (per SendMessage() - die meisten CListBox-Methoden kapseln sowieso die Bearbeitung verschiedener Windows-Nachrichten).
-
könntest mir da mal ne beispiel geben wie man das macht.
also man legt in der message map ne die message WM_USER an?!
-
Gegenfrage: Was genau willst du in der ListBox erledigen?
-
dient nur zur überprüfung und überwachung, also wenn sich ein neuer client verbunden hat, oder daten empfangen wurden.
-
also wenn du ein Dialogfeld hast,
auserhalb einer Classe bzw. in der StdAfx.h#define WM_BULUBB_MESSAGE (WM_APP + 10001) //Benutzer definierte Nachrichtaus der funktion wo die nachricht gesendet werden soll
SendMessage(WM_BULUBB_MESSAGE, (WPARAM)0 , (LPARAM)0);die Param werte kannst du jetzt noch belegen mit den Nachrichten werten die du weterleiten willst wenn dir pro Param ein Parameter nicht reicht kannst du sie noch mit HI/LOWORD belegen kuck dir dazu MAKEWPARAM & MAKELPARAM in der MSDN an.
in dem dialog wo sie abgefangen werden soll setzt du auserhalb der
//}}AFX_MSG_MAPON_MESSAGE(WM_BULUBB_MESSAGE,OnFunktionBlubMessage)die funktion OnFunktionBlubMessage must du dann noch in der entsprechenden Header des Dialogs deklarieren bzw in der *.cpp auch auflösen und natürlich die beiden Param werte nicht vergessen
void OnFunktionBlubMessage(WPARAM wParam, LPARAM lParam)
das wars
-
also erstmal besten dank.
LowFly schrieb:
in dem dialog wo sie abgefangen werden soll setzt du auserhalb der
//}}AFX_MSG_MAPON_MESSAGE(WM_BULUBB_MESSAGE,OnFunktionBlubMessage)da bekomm ich dann ne fehler! in dem dialog steht dann:
ON_WM_TIMER() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_btnsend, &CEmpfaengerDlg::OnBnClickedbtnsend) ON_MESSAGE(WM_BULUBB_MESSAGE, &CEmpfaengerDlg::OnFunktionBlubMessage)der fehler lautet:
Fehler 1 error C2440: 'static_cast': 'void (__thiscall CEmpfaengerDlg::* )(WPARAM,LPARAM)' kann nicht in 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)' konvertiert werden
-
hmmm was ist das

&CEmpfaengerDlg::
warum machst du das wenn die funktionen OnBnClickedbtnsend & OnFunktionBlubMessage in der classe CEmpfaengerDlg sind

lass das mal weg zumindest bei OnFunktionBlubMessage
-
wenn ichs weglasse bekomm ich den gleich fehler.
-
ka was bei dir verkehrt läuft bei mir funzt das so. wäre der weg falsch den ich dir beschrieben hab, hätte sich da bestimmt schon jemand gemeldet und hätte es berichtigt.

-
ok dann nehm ich mal an das ich das irgendwie falsch verstanden hab!
ich erstelle ein dialog basierenden projekt mit dem namen server.
er erstellt mir die datein
server.cpp und .h
serverdlg.cpp, .h, stdafx und resourcejetzt füg ich die Zeile:
#define WM_BULUBB_MESSAGE (WM_APP + 10001)ganz oben in die serverdlg.cpp ein
dann die funktion:
void OnFunktionBlubMessage(WPARAM wParam, LPARAM lParam)in die serverdlg.h in die Klasse CserverDlg und anschließend in die serverdlg.cpp
dann füg ich in der serverdlg.cpp die ON_Message zeile hier ein:
BEGIN_MESSAGE_MAP(CserverDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_MESSAGE(WM_BULUBB_MESSAGE,OnFunktionBlubMessage) //hier eingefügt END_MESSAGE_MAP()hab ich das so richtig verstanden?

-
Fast - die #define Zeile sollte eventuell in der "serverdlg.h" landen, damit auch andere Klassen deines Projekts deine Message-ID verwenden können.
-
ja da hatte ich die auch schonmal drin, leider behebt das meinen fehler nicht.

-
ändere mal deine Funktion
void OnFunktionBlubMessage(WPARAM wParam, LPARAM lParam)in
LRESULT OnFunktionBlubMessage(WPARAM wParam, LPARAM lParam) { //mach was return 0L; }der Prototype in der h-Datei sieht dann so aus
afx_msg LRESULT OnFunktionBlubMessage(WPARAM wParam, LPARAM lParam)dann sollte es gehen.
Gruß Matthias
-
ich könnt dich küssen!
der fehler ist weg 
so.. nun mit
SendMessage(HWND_BROADCAST,WM_BULUBB_MESSAGE, (WPARAM)0 , (LPARAM)0);sollte mein dialog doch die nachricht empfangen oder?
oder wie bekomm ich die hwnd von meinem dialog raus?//edit
HWND test=this->m_hWnd;
klappt!
frohe weihnacht :xmas1: