Aktualisieren eines DlgItems von Thread aus ( FAQ Lösung funkt leider net )
-
Hi,
ich möchte während mein Thread läuft in ein Dialogitem zeichnen. Nur hab ich das Problem, dass er sporadisch zeichnet. Sprich, wenn der Thread läuft wird das Item manchmal gezeichnet und manchmal net. Hier mal der Code der ausgeführt wird im Thread ... das Zeichnen an sich läuft im OnPaint ab.
UINT VisDialog::Output(LPVOID pParam){ int i; VisDialog *pVisDialog = (VisDialog*) pParam; pVisDialog->UpdateRC(); for (i = pVisDialog->mi_timerpos; i < pVisDialog->mMasterIndex.size() && pVisDialog->m_Interrupt != 1; ++i) { pVisDialog->SendMessage(WM_PAINT, (WPARAM) 0, 0); pVisDialog->DoEvents() ; // pVisDialog->m_ctrlGlProgress.RedrawWindow(); i = pVisDialog->FillFields(i); pVisDialog->GotoPosition(i); /* pVisDialog->UpdateTime(0,i); */ i++; }
Ich hab das auch mal mit dem RedrawWindow getestet, allerdings bringt das gar nix. Da is mein Feld in das ich zeichnen möch einfach nur grau. Muss ich mir da evtl noch was mit dem DC machen damit dieser verwendet werden kann vom thread aus?
-
ich hattte vor paar weeks das selbe prob, ich habs gelöst in dem ich die Daten im thread gesetzt habe und dann eine Benutzer MSG an mein Dialog geschickt habe der ein Update aufruft, da dies im Thread nicht funzt..
für bessere Wege bin ich aber immer Offen
-
da muss es doch was einfacheres auch geben, ich habs ja mittlerweile so weit dass es ja schon halbwegs funkt nur wenn ich den thread starte braucht es eine Weile bis - was da auch immer passiert - diese Visualisierung funkt.
Da zu ruf ich folgende Reihenfolge der Befehle auf
SendMessage(WM_PAINT, 0, 0); DoEvents() ; GetDlgItem(IDC_OPENGLPROGRESS)->RedrawWindow();
is aber immernoch kacke so,
Kannst du evtl. deine Lösung posten?
-
// .... im Thread MeinDialog->strMeineStaticVar = "Hallo Welt"; MeinDialog->strMeinEditFeld = "Bitte füllen"; MeinDialog->PostMessage(MYMSG+PARAMS); // .... im Thread
MessageHandler im Dialog, nicht Thread.
CMeinDialg::MYMSG { UpdateData(FALSE); }
das klappt sehr schnell, ich mache das in einem Datei copy thread... der dann grösse geschwindigkeit und andere werte refreshed....
T1c4L
-
ich glaub ich werd noch wahnsinnig!!! Also es geht immernoch nicht so wie´s soll. Das mit der Message klappt auch net so richtig, da ich ja ohnehin das Zeichnen im OnPaint mach, hätt ich eigentlich keine eigene gebraucht.
Ich denk mal bei mir hab ich noch die zusätzliche Schwierigkeit, dass ich zeichnen tu und da funkt irgendwas mit dem DC net richtig.
Bin jetzt allmählich echt am verzweifeln
-
OnPaint, im Dialog oder in einer View?
bist du doch im Dialog oder? ich habe mal gehört man soll das OnPaint bei dialogen nicht so benutzen... weiss aber nicht warum... kann auch sein das die person selber keine ahnung hatte....
aber wenn du im dialog bist, dann gibt deinem thread nen zeiger zu deinem dlg mit, mal im thread, post msg im thread an dien Dialog und der soll nen updatedata(false) call so mach ich das und es klappt.
aber ne coolere lösung fänd ich nicht schlecht...
man sag thread -> als arbeiter oder eingabe ....und was ich das mache ist ja mehr als nur was berechnen im background....
-
also ich bin in einem Dialog und das mit dem Zeiger und Dialog mach ich bereits nur hats bisher überhaupt nix gebracht .... es ist echt total nervig.
Seltsamerweise funkt die Visualisierung jetzt halb, wenn ich den Thread starte braucht die Visualisierung ne Weile bis das Feld aktualisiert wird in das ich zeichne( ca 1 s ) danach läufts wunderbar, nur warum versteh ich grad im augenblick auch net.
Der Thread der bei mir läuft ist ein Arbeiterthread, es werden eigentlich nur massig daten ausgegeben
-
...höher stellen...schon ausprobiert? AboveNormal oder stück höher....
vieleicht braucht deine Windows/cpu aufteilzeit fuer thread und prozess... zu lange ....
-
nein noch net, muss ich gleich mal testen
-
super grad getestet es geht nu, vielen Dank für die Hilfe ..... ich war ja schon echt am verweifeln
-
konnt dir helfen? fett! ich bin nämlich erst seit knapp nem jahr dabei :p
juhuuu *level up spürt*[i]
-
da hast du grad einiges an xp für deinen lächsten levelaufstieg gesammelt *g*