Thread et actualisation de l'affichage

Résolu
jul39dole Messages postés 117 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 21 janvier 2011 - 15 nov. 2005 à 18:54
jul39dole Messages postés 117 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 21 janvier 2011 - 15 nov. 2005 à 22:48
Bonjour,
voici mon problème : (sous C++, programmation API windows)

- Je créé un boite de dialogue avec DialogBox, jusque là tout va bien.
- Un bouton permet de lancer un calcul :

case WM_COMMAND :

switch(LOWORD(wParam))
{

case IDC_CALCULER:
On appelle une fonction qui lance le thread de calcul
Pendant ce temps l'exécution continue ici :


while(p.JeCalcule)
{
Sleep(100);
Et affichage de la progression.
}
...

- Cependant, cela bloque les messages de gestion de l'affichage (les WM_PAINT je suppose), et la fenêtre se fige.

Auriez-vous une solution à me proposer ?

D'avance merci.

7 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 nov. 2005 à 22:46
pourquoi VirtualAlloc: parce que c'est écrit API dans la question, rien de plus.

#define MSGAVANCE (WM_USER + 100)

dans thread tu fais des PostMessage(hwndcible, MSGAVANCE, 0, 0);
que tu traites dans la fenetre pour dessiner avancement, ainsi tu gardes la séparation.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 nov. 2005 à 19:16
Sleep en boucle, normal que ça bloque, non ?

Si c'est la progression de ce que fait le thread, mets l'affichage de cette progression DANS le thread.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
jul39dole Messages postés 117 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 21 janvier 2011
15 nov. 2005 à 20:25
Après test, avec ou sans le Sleep, cela ne change rien.

Il faut en effet que l'affichage de la progression se fasse dans le thread.
Comment dois-je faire ? Exporter mes handles de la thread? et envoyer des messages PAINT pour redessiner la fenêtre ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 nov. 2005 à 20:55
Clair que ce n'est pas Sleep par lui même qui bloque mais bien sur la boucle.

Donne hwnd de progressBar ou autre au thread, soit par une var globale soit en param du thread.
Par un pointeur de struct, on peut passer 1000 params au thread si on veut. Attention toutes fois qu'en cas de struct, elle ne doit pas être sur pile et disparaitre illico après appel de CreateThread sinon badaboum. Fais un VirtualAlloc au besoin, caste en une struct et passe au thread, thread fera un VirtualFree sur son param en sortie et tout ira bon.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jul39dole Messages postés 117 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 21 janvier 2011
15 nov. 2005 à 22:13
heu je passe déjà un pointeur sur une classe à mon thread, donc je vais inclus les hwnd dans ma classe.
Pourquoi un VirtualAlloc plutot qu'un simple new ?
0
jul39dole Messages postés 117 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 21 janvier 2011
15 nov. 2005 à 22:31
mais en fait le pb c'est qu'il faut séparer le programme en deux parties :
- une partie interface graphique
- une partie noyau
en donc en s'occupant de l'interface dans le kernel, la séparation n'est plus aussi nette...
0
jul39dole Messages postés 117 Date d'inscription mardi 22 juillet 2003 Statut Membre Dernière intervention 21 janvier 2011
15 nov. 2005 à 22:48
ok merci bien !
0
Rejoignez-nous