2010-04-21 11 views
4
Mettre fin

J'ai un problème aussi décrit ici: http://www.delphigroups.info/3/9/106748.htmlconstructeur C RAD 2010 RTL/VCL Application-> terminate() Fonction NON L'APPLICATION

J'ai essayé presque toutes les formes de placement Application-> terminate() func partout dans le code, suivre et non 'return 0', 'ExitProcess (0)', 'ExitThread (0)', exit (0). Aucune variante de travail ne ferme l'application. Au lieu de cela, le code après l'application Application-> Terminate() est en cours d'exécution.

J'ai deux threads ou plus dans l'application. J'ai essayé d'appeler termin func dans created après les threads d'exécution et dans le thread principal.

Aussi ce n'est pas lié (autant que je peux l'imaginer) avec CodeGuard/madExcept (je l'ai éteint et allumé, aucun effet). Le tournage de CodeGuard n'a pas non plus réussi.

La seule variante de code de travail consiste à placer l'appel Application-> Terminate() à n'importe quel gestionnaire OnClick de n'importe quel bouton de formulaire. Mais cela ne correspond pas à mes besoins. Je dois terminer à n'importe quel endroit.

Que dois-je faire pour mettre fin à tous les threads dans l'application C++ Builder 2010, puis mettre fin au processus?

Répondre

3

Application->Terminate() ne ferme pas l'application immédiatement, il signale seulement que vous voulez fermer l'application.

Terminate appelle l'API Windows fonction PostQuitMessage pour effectuer un arrêt ordonné de l'application. Terminate n'est pas immédiat.

Dans vos fonctions appellent Application->ProcessMessages() puis vérifier si la propriété Application->Terminated est vrai.

Pour les applications utilisant boucles de calcul à forte intensité, appelez ProcessMessages périodiquement, et vérifier également TERMINATED pour déterminer si vous souhaitez annuler le calcul et permettent l'application de mettre fin à

Par exemple:

void Calc() 
{ 
    for (int x = 0; x < 1000000; ++x) 
    { 
    // perform complex calculation 

    // check if need to exit 
    Application->ProcessMessages(); 
    if (Application->Terminated) 
    { 
     break; 
    } // end if 
    } // end for 

    // clean up 
} 
+0

Mais quelles sont les conditions à remplir? J'attends la fermeture de l'application pendant environ 2 minutes et rien ne se passe .. – ergey

+1

J'ai trouvé que la seule façon de vraiment terminer mon programme dans n'importe quel endroit est d'appeler ces séquences: FormDestroy(); // aussi tous les blocs sans mémoire que je mets ici TerminateProcess (GetCurrentProcess(), 0) – ergey

+0

@ergey J'ai développé ma réponse avec un exemple. – stukelly