leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 2010
-
7 sept. 2004 à 20:18
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 2010
-
9 sept. 2004 à 22:33
salut a tous.
apres avoir posté ces differentes kestion et ne pas y avoir eu de reponses (maintenant elles sont a perpetes ds la liste des topics, dc jesperes plus trop de ces posts), je les réunis ici en esperant plus de succes....
1ere question: j'ai un prog ds la systray, lorsque jai un plantage genre "explorer va fermer", ma systray se redessinne, et evidemment mon prog ne se remet pas. y'a t il un evenement particulier que je pourrais capter afin de redessiner ma systray
2eme question: mon prog change la resolution avec ChangeDisplaySettings(), mais windows n'est pas au courant ke la resolution est changé. je m'explique : si windows est en 800*600 et ke mon prog me met en 1024*768, je peux pas mettre dicone en bas a droite de mon bureau car windows croit ke je suis en 800*600 (et dc le coin en bas a droite n'existe pas....). alors comment je fais?
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 9 sept. 2004 à 22:21
bon bah pas besoin de mettre ds un thread, j'ai fait le test, mais un grand merci a vous pour m'avoir répondu, et pis ca maurait fait faire un premiere approche des thread, cest deja ca. et puis ca fait du bien la solidarité, et de se sentir aidé :D
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011 7 sept. 2004 à 21:00
Windows 95/98/Me: If the calling thread has any windows, ChangeDisplaySettings sends them the WM_DISPLAYCHANGE message immediately (for windows in all other threads, the message is sent when the thread can receive nonqueued messages). This may cause the shell to get its message too soon and could squash icons. To avoid this problem, have ChangeDisplaySettings do resolution switching by calling on a thread with no windows, for example, a new thread.
Il propose, pour résoudre le problème, d'appeler ChangeDisplaySettings() via un nouveau thread(via CreateThread()) ...
Tu cré un nouveau thread et lui passe en paramètre la nouvelle résolution, une fois le thread créé, attend qu'il ce ferme avec WaitForSingleObject( handle_du_thread, INFINITE );
Une fois le thread fermé, tu valide, via une variable global ou autre ...
par exemple:
HANDLE hThreadHandle;
DWORD dwThreadId;
int IsOkay;
if ( IsOkay ) {
/* tout c'est bien passé */
}
else {
/* erreur */
}
return 0;
}
C'est une idée, sinon, c'est simplement que le système n'a pas recu les dernières modifications, il te faudrait seulement trouver comment enregistrer les nouvelle modifications pour que le système s'y ajuste ...
Pour ce qui est du systray, je l'ignore, désolé ...
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 7 sept. 2004 à 21:07
merci pr cette reponse, jaccepterais plus tard en atendant ke jai aussi une reponse a une autre question. les threads, je sais pas encore faire, dc je garde ta reponse de coté, ca va m'aider, je vais procéder comme ca des ke jaurais appris. encore merci pr ca.
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 8 sept. 2004 à 13:27
bah j'y avais pensé.....mais bon, c'est pas beau du tout, je préfererais trouver un message a traiter ou un truc du genre...mais je garde en solution de dernier recours....
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 9 sept. 2004 à 07:58
nitric, tu pourrais m'expliquer vite faite deux ou trois trucs pr les threads, histoire que je m'y colle? et accessoirement sur ton bout de code.... :D bon ca a pas l'air compliqué (ca serait pr linstant juste pr comprendre le fonctionnement simple, le multithreading on verra plus tard...). bon donc:
c'est quoi le OL de ton DWORD, ca signifie koi?
cest koi les erreurs kil pourrait y'avoir ds mon thread? c'est propre a l'utilisation d'un thread la, ou cest juste une erreur ki pourrait survenir sur le cahngedisplaysettings?
et la une pitite kestion existentielle assez importante.....kan je crée mon thread, le reste de mon prog peut continuer a tourner non? donc si je saisis bien, il faudrait ke je mette tt mon code du reste du prog apres le waitforsingleobject, sinon mon thread va faire ses traitements et etree bloqué jusqu'a ce que l'instruction waitetcetera soit trouvée? c'est bien comme ca ke ca fonctionne?
toute les instruction entre le creat et le wait seront executées en "simultanées" de l'execution du thread (la gestion au nv du systeme ca je sais, enfin je crois, cest le coté codage ki me gene, pas le foncitonnement interne). voila, pr linstant ca devrait aller, j'attend ta reponse, et si j'ai des pbs apres, je reposterais, mais je pense ke ca ira, ca a pas l'air super super dur...
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011 9 sept. 2004 à 10:27
Lorsque le système lance ton exécutable, il cré un process dans lequel ce trouve un minimum de un thread(qui est créé par le systeme) ou sera appelé/executé le point d'entré de ton application(main() ou WinMain()) et en suivera l'exécution du reste de ton code/instructions/...
Un thread == une instruction à la fois
Deux threads == deux instructions à la fois
etc ...
un DWORD est simplement un `unsigned long`, entier non signé définie dans windef.h si mes souvenirs sont bons.
Dans ton thread, les erreurs qu'il pourait y avoir dépendent du code que tu vas y mettre et non du thread lui-même.
Oui, si tu met du code entre le CreateThread() & le WaitForSingleObject(), ce code pourait être exécuté en même temp que celui du thread. Tout dépend des tâches que les threads doivent effectuer.
Tout ceci n'est peut-être pas très claire mais, j'ai un excellent lien à te proposer qui traite du multithreading, il est parfait et très bien expliqué, il y à quelques exemples, mise en situation, etc ... il est en francais >> http://bob.developpez.com/tutapiwin/article_46.php
Je le conseil _fortement_ à tout ceux/celles qui veulent en savoir d'avantage(ou tout simplement apprendre) sur le multithreading, débutant ou non.
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 9 sept. 2004 à 11:15
bah ecoute merci....pr les threads, javais dc les idées a peu pres ckaires (sauf sur la mise en oeuvre pratique....). et ce que je te demaindais pr ton DWORD, cest pk OL, ca signifie qqch de particuilier je suppose....
a priori les seules instructions que je puisse avoir ds mon threads seraient le changement de resolution par changedisplaysettings, et la recuperation des parametres courants de l'ecran pr changer la resolution en gardant le reste des parametres...donc je pense pas traiter d'erreurs, ds ce cas....
merci pr ca, je vais voir comment je peux me dépatouiller avec
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 9 sept. 2004 à 11:33
ah oui, deux autres kestions :
pk a la fin du thread tu fais
exitthread (0);
return 0;
??????????????????????????????????????????
et deuxieme kestion, les parametres des deux fonctions? enfin la fonction w8, pas tres difficile, et la premeire, jen devine qqs un, mais pas ts......voila, merci davance
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011 9 sept. 2004 à 11:43
ExitThread(0) te permet de mettre fin au thread, libère les ressources et autres utilisée par le thread etc ...
le `return 0;` c'est simplement pour le compilateur, éviter d'avoir un warning étant donnée que le proto d'un thread Win32 est:
DWORD WINAPI MonThread( void * ); << doit retourner une valeur(entier long)
La fonction WaitForSingleObject() c'est simple, premier argument, le handle du thread sur lequel patienter, le second argument, le temp maximum d'attente, INFINITE représente -1L, WaitForSingleObject() va patienter jusqu'a ce que le thread n'est pas modifié son status ou jusqu'a un timeout(WAIT_TIMEOUT) ou une erreur ou autre ... en gros, à l'infinie ou tant qu'il n'y à pas de problème ou de signal.
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes(Généralement à NULL sauf à l'exception de certain besoin spécifique)
DWORD dwStackSize, // initial thread stack size(généralement à 0 sauf à l'exception de certain besoin spécifique, de base(par défaut), 1mo est réservé à chaque nouveau thread créé(pour la pile))
LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
LPVOID lpParameter, // argument for new thread
DWORD dwCreationFlags, // creation flags
LPDWORD lpThreadId // pointer to receive thread ID
);
Je crois que le reste est amplement simple à traduire alors pas la peine de le faire :}
Sinon, il y à MSDN ou tout est très bien détaillé à ce sujet.
dwExitCode contient le code de sortie du thread, est utile pour savoir si le thread à quitté à cause d'une erreur ou autre, dwExitCode vaut STILL_ACTIVE(259) si le thread est toujours actif, ne pas utiliser cette valeur comme code de sortier :}
et j'ai remplacé tous mes appels a ChangeDisplaySettings par des appels a ChangeRes........quelque chose de pas bon? ou c'etait pas la soluce? (en tous les cas merci d'avoir proposé :D)
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011 9 sept. 2004 à 22:29
Oui, évidement. si tu look mon tout premier message, tu vas voir qu'il s'adressait seulement à `Windows 95/98/Me`, quand j'ai répondu la première fois je ne savais pas que tu étais sous XP :}