Mes questions sans réponses [Résolu]

Signaler
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
-
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
-
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?

merci d'avance pr vos reponses

21 réponses

Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
bon bah chui un gros abruti, suffisait de (bien) fouiller msdn :
ChangeDisplaySettings (&mode, CDS_UPDATEREGISTRY);

et voila....a savoir si jai besoin de le mettre ds un thread pr de vrai ou pas........
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
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
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

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;

typedef struct coord {
int x;
int y;
}coord;

DWORD WINAPI MonThread( void * arg ) {

coord c = *(coord *)arg;

/* ... */
ChangeDisplaySettings( ..., c.x, c.y, ... );

/* si aucune d'erreur */
IsOkay = 1;

ExitThread(0L);
return 0L;

}

int main() {

coord c;
IsOkay = 0;

c.x = x_value;
c.y = y_value;

hThreadHandle = CreateThread(NULL, 0L, MonThread, (void *)&c, 0L, &dwThreadId);

WaitForSingleObject( hThreadHandle, INFINITE );

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é ...

~(.:: NitRic ::.)~
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Pour le systray, tu passes sous xp, et plus de bug de ce genre
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
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.
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
je suis sous xp :(
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
un ptit timer peut-être, mais c'est pas très joli
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
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....
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
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...
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

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.

~(.:: NitRic ::.)~
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
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
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Ah okay, le 'L' majuscule désigne un entier long

unsigned long/*DWORD*/ i = 12345L; par exemple

c'est optionnel, te casse pas la tête avec ca même si c'est toujours bon de le savoir :}

~(.:: NitRic ::.)~
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
oki!! je connaissais pr les floats, mais javais jamais vu pr les long, dc jai pas percuté
merki
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
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
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

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.

~(.:: NitRic ::.)~
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
ok merki.
pr le exitthread (0), il signifie koi le 0?
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

Le code de sortie du thread

ex:

hnd = CreateThread( ... );
WaitForSingleObject( hnd, INFINITE );

GetExitCodeThread( hnd, &dwExitCode );

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 :}

~(.:: NitRic ::.)~
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
oki.....je captais pas pk mettre un return en plus dun exitthread qui ds ma tete modifiais une variable globale...
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
17
sniff ca marche pas. est ce que j'ai fait une connerie ou est ce que c'etait pas la soluce? voci mon code :

DWORD WINAPI MonThread(void * arg)
{
DEVMODE mode = *(DEVMODE *)arg;
ChangeDisplaySettings (&mode, 0);

ExitThread (DWORD (0));
return DWORD (0);

}//MonThread

inline void ChangeRes (DEVMODE & mode)
{
hThreadHandle = CreateThread(NULL, 0L, MonThread, (void *) &mode, 0L, &dwThreadId);

WaitForSingleObject( hThreadHandle, INFINITE );

}//ChangeRes

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)
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

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 :}

~(.:: NitRic ::.)~