Thread et actualisation de l'affichage [Résolu]

Signaler
Messages postés
117
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
21 janvier 2011
-
jul39dole
Messages postés
117
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
21 janvier 2011
-
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

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
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++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
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++
Messages postés
117
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
21 janvier 2011

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 ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
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++
Messages postés
117
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
21 janvier 2011

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 ?
Messages postés
117
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
21 janvier 2011

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...
Messages postés
117
Date d'inscription
mardi 22 juillet 2003
Statut
Membre
Dernière intervention
21 janvier 2011

ok merci bien !