begin process at 2012 05 30 19:09:56
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Autre

 > 

trop de changements sur un Form = plantage (Borlandc++Builder)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

trop de changements sur un Form = plantage (Borlandc++Builder)

mercredi 9 février 2011 à 16:28:03 | trop de changements sur un Form = plantage (Borlandc++Builder)

claudiusenshortus

Bonjour,
Je suis de retour sur le forum avec une nouvelle question.

Mon problème:
En c++ avec Borland C++ Builder 6.0, j'utilise des Forms et des threads.
Et j'ai 2 questions (dont 1 pseudo réponse) :

- pourquoi les ShowMessage(); appelés depuis des threads font tout planter ?
J'avais fait une recherche à l'époque, et la solution est de ne pas les utiliser. Barbare, mais efficace.

- pourquoi lorsque l'on fait changer trop de chose sur un Form par des threads, il plante ? Ex : un Shape ou un Label qui va changer très souvent, surtout pour un Shape qui est de grande taille.
Pour le Label, je n'ai plus souvenir de quand date mon dernier problème (on oubli).
Pour le shape, j'ai réduit sa taille au mini, mais le bug n'est pas loin.
Mais aujourd'hui, j'ai le même problème avec un TabSheet.
Dans mon Form, j'ai un "gros" TabSheet (5 onglets, de la taille de la fenêtre, de la taille de l'écran). Si je clic d'onglets à onglets, tout va bien. Mais si ce changement se fait par le programme lui-même, le changement se fait, la fenêtre se fige et aucune exception n'est levée (j'ai des try/catch(Exception &exception)/catch(...) qui enregistrent les erreurs sur fichier).
Voici 2/3 extraits:
le fichier du projet:

Code C/C++ :
 
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR lpCmdLine, int)
{
	try
	{
		Application->Initialize();
		Application->CreateForm(__classid(TForm1), &Form1);
		Application->Run();
...


le fichier du Form avec le thread:

Code C/C++ :
 
DWORD WINAPI ThreadOngletsPageControl(LPVOID lpParam)
{
...
case ONGLET_TEMPERATURES:
{	Form1->PageControl1->ActivePage = Form1->TabSheetTemperatures;
...

La fonction qui crée le thread: (désolé, la mise en page a sauté)

Code C/C++ :
 
tempoThreadOngletsPageControl  = 800; //ms
lpThreadAttributes_unit_maison      = NULL;	        //pointer to thread security attributes
dwStackSize_unit_maison             = 0;	          //initial thread stack size, in bytes
lpStartAddress_unit_maison          = &ThreadOngletsPageControl;  //pointer to thread function
lpParameter_unit_maison             = NULL;	        //argument for new thread
dwCreationFlags_unit_maison         = NULL;	        //creation flags(CREATE_SUSPENDED...)
handleThreadOngletsPageControl = CreateThread( lpThreadAttributes_unit_maison,
dwStackSize_unit_maison,
lpStartAddress_unit_maison,
lpParameter_unit_maison,
dwCreationFlags_unit_maison,							lpThreadId_unit_maison);
priorityThreadOngletsPageControl = THREAD_PRIORITY_NORMAL;//2 points below normal priority for the priority class.
if(!SetThreadPriority(handleThreadOngletsPageControl,priorityThreadOngletsPageControl))



Ce sont les lignes
Code C/C++ :
Form1->PageControl1->ActivePage = Form1->TabSheetTemperatures;

qui font planter le programme.

Alors, dans mon désespoir, j'ai essayé de mettre ces changements dans une autre fonction et de faire appel à cette fonction depuis le thread (c'est con, mais on ne sait jamais)--> ça plante toujours.

J'ai ajouté des trucs comme

Code C/C++ :

 
Form1->PageControl1->Update();
Form1->PageControl1->Repaint();
 
Form1->Update();
Form1->Repaint();
...


Mais rien y fait.

Par contre, si je fais ce changement d'onglet depuis un clic sur un bouton (ou autre, mais sans passer par le thread), ça marche.

Code C/C++ :
 
void __fastcall TForm1::Button27Click(TObject *Sender)
{    Form1->PageControl1->ActivePage = Form1->TabSheetTemperatures;
}

Donc le problème vient bien du thread.


J'ai une petite idée, mais mes compétences se limitent ici : ne serait-ce pas un problème de mémoire du thread ?
En tout cas, dans le gestionnaire des tâches de Windows, j'utilise 0% du proc et pas grand chose en mémoire, et rien ne change après plantage.

Voila, à vous et merci.
mercredi 9 février 2011 à 20:54:18 | Re : trop de changements sur un Form = plantage (Borlandc++Builder)

BruNews

Administrateur CodeS-SourceS
Tu es certain qu'il n'y a pas de "Borlanderie" pour gérer les threads ???

On fait soit en WinAPI soit autre chose.

ciao...
BruNews, MVP VC++
mardi 15 février 2011 à 07:59:11 | Re : trop de changements sur un Form = plantage (Borlandc++Builder)

claudiusenshortus

Je ne vois pas de quoi tu parles, je ne connais qu'une seule façon de faire (celle de mon message).
Si tu en sais plus, peux-tu me mettre sur le bon chemin.

De mon coté, je vais voir comment on peut les gérer d'une façon différente.

D'ici là, pour me dépanner, j'ai utilisé un evenement qui arrive souvent afin d'avoir une sorte de "thread" pour les mises à jour de l'affichage. C'est moche, mais ça fonctionne.

Code C/C++ :
void __fastcall TForm1::FormCanResize(TObject *Sender, int &NewWidth,
			int &NewHeight, bool &Resize)
{	Form1->mAJOngletPageControl();
	//miseAJourAffichage();
}
dimanche 29 mai 2011 à 16:47:16 | Re : trop de changements sur un Form = plantage (Borlandc++Builder)

rt15

Membre Club Administrateur CodeS-SourceS
Bonjour,

Désolé pour la réponse tardive.
Il y a bien une Borlanderie, car la VCL n'est pas thread safe. Il faut donc utiliser Synchronize pour que les threads secondaires demandent au thread principal d'appeler la VCL lui même.

Cherche Synchronize dans l'aide de C++ Builder ou sur le net, ici par exemple.


Cette discussion est classée dans : code, thread, form1, maison, unit


Répondre à ce message

Sujets en rapport avec ce message

à propos des threads [ par GUERRIER_ABSOLU ] Salut, je voudrais savoir s'i quelqu'un a déjà essayé d'appeler une fonction dans un thread et a remarqué quelque chose d'innatendu. En fait quand j'a Class & CreateThread [ par Renfield ] Bonjour, j'ai un petit soucis de compilation...dans une classe, je voudrais créer un Thread. ma proc est définie comme cela :LPTHREAD_START_ROUTINE Passer un code PERL en C++ [ par gaspard83 ] Bonjour à tous, J'ai trouvé un script Perl qui correspond à une recherche que je fais depuis un certain temps : passer du morse sur les leds du clavie Prob de thread [ par sebastienbro ] Bonjour, j'ai un problème avec des thread, je n'arrive pas a en créer un :(Voici mon code : HANDLE hThread1;DWORD dwThreadId1;DWORD WINAPI T Terminer un thread [ par vecchio56 ] RebonjourJ'ai crée un thread de la manière suivante:HANDLE hThread = CreateThread(0, 0, ThreadProc, &ts, 0, &dwThreadId);et je Lancement thread successif (ordonnés) [ par themaste ] Salut!Voila, j'ai une question d'ordre propreté du code. En fait, j'ai plusieurs thread, et j'aimerais pouvoir les lancés les un après les autres..je Question sur Thread dans mon serveur multithread [ par Nixeus ] Bonjour a tous !J'ai récupérer un code source d' un serveur multithread multi client, en mode console.J'ai repris les classes et j'ai porté ce program Threads sous Windows/Linux [ par raananb ] L'extrait de code ci-après (développé avec wxWidgets en C++) traite une série de fichiers : pour chaque fichier il affiche le nom dans un label, une i thread [ par li ] voila mon code  ...j'esplique, j'ai une class qui contien une function que je veut apeler dans un thread et cela me cause certain probleme   que j'ai [QT] Probleme avec QListWidget [ par Ilsundal ] Bonjour à tous,j'ai un probléme d'actualisation de ma QListWidget dans mon programme, en fait cette QList me sert de journal (log) pour les action du


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,997 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales