Besoin de précision sur TThread
1) Dans un objet dérivé de TThread j'ai une propriété qui initialise une variable membre privée. Cette propriété, écrite par l'application principale, est cycliquement regardée dans le Exécute() du thread pour en faire quelque chose. Y a t-il des précautions particulières à prendre pour l'accès a cette variable ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
//***** FICHIER .H ***********************************
#ifndef Unit2H
#define Unit2H
#include <Classes.hpp>
class MonThread : public TThread
{
private:
AnsiString FBuffer;
protected:
void __fastcall Execute();
public:
__fastcall MonThread(bool CreateSuspended);
__property AnsiString Buffer = { read = FBuffer, write = FBuffer};
};
#endif
//***** FICHIER .CPP *********************************
#include "Unit2.h"
#pragma package(smart_init)
__fastcall MonThread::MonThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
void __fastcall MonThread::Execute()
{
//---- Placer le code du thread ici ----
while(! Terminated)
{
Sleep(100);
// Ici Faire quelque chose avec FBuffer
}
} |
2) Lorsque l'application principale appelle une méthode d'un objet dérivé de TThread, cette méthode est-elle appelée dans le contexte du thread principal ou dans celui du thread courant ?
3) Si depuis Execute() de l'objet Thread, j'appelle une fonction du thread principal via Synchronize(), la dite fonction peut-elle appeler à son tour sans pb une méthode de ce même l'objet Thread ?
Merci d'avance pour votre aide.
Re: Besoin de précision sur TThread
Bonjour,
Citation:
Envoyé par psau
1) Dans un objet dérivé de TThread j'ai une propriété qui initialise une variable membre privée. Cette propriété, écrite par l'application principale, est cycliquement regardée dans le Exécute() du thread pour en faire quelque chose. Y a t-il des précautions particulières à prendre pour l'accès a cette variable ?
Si ta variable risque d'être utilisée par plusieurs threads, il vaut mieux mettre en place une section critique (TCriticalSection) ou un autre mécanisme (comme les sémahpores) qui permet de garantir qu'un seul thread à la fois peut accéder au contenu de cette variable.
Citation:
Envoyé par psau
2) Lorsque l'application principale appelle une méthode d'un objet dérivé de TThread, cette méthode est-elle appelée dans le contexte du thread principal ou dans celui du thread courant ?
A mon avis elle sera appelée dans le contexte du thread contenant la méthode, mais ce n'est que mon avis.
Citation:
Envoyé par psau
3) Si depuis Execute() de l'objet Thread, j'appelle une fonction du thread principal via Synchronize(), la dite fonction peut-elle appeler à son tour sans pb une méthode de ce même l'objet Thread ?
Euhh oui pourquoi pas ? C'est un simple appel de fonctions, même s'ils sont dans des threads différents.
Mais il faut toujours faire attention aux zones mémoires partagées par plusieurs threads.
Citation:
Envoyé par psau
Merci d'avance pour votre aide.
De rien et bon courage 8)