[TThread] Question conception : ajout méthode publique à un Thread
Message Original : (voir fin de ce post pour ré-expression de la question :D )
(Re)Bonsoir à tous,
Je travaille actuellement sur une application manipulant entre autres un GPS et des caméras.
Pour des raisons de performances, je compte créer cette application en multi-thread.
Seulement, il y a une partie où je ne vois pas trop comment je vais m'y prendre (pour le moment je réfléchie beaucoup à comment créer tout ça ... j'essaie d'anticiper sur les soucis).
En fait je compte créer un thread par caméra utilisé (cela n'excèdera pas 4 caméras ... et encore ... ). Ce thread aura différent buts :
1) créer mon objet caméra
2) Prendre des photos à partir de la caméra
3) effectuer divers traitements sur les images récupérées (permettant ainsi de régler à nouveau la caméra pour les prises de photos futures)
Comme je viens de le dire, je compte dans chaque thread instancier un objet de type caméra (pas de problème particulier ?) permettant ainsi de manipuler mes caméras (physiques) plus facilement.
Seulement, depuis ma fenêtre principale, l'utilisateur devrait pouvoir modifier certaines propriétés de mes caméras (à l'intérieur de mes threads).
Je tiens à préciser que JAMAIS le thread ne sera en cours d'exécution lors d'une modification des paramètres de mes caméras (un appel à suspend aura été fait forcément avant).
Je pensais alors ajouté à ma classe TThreadCamera par exemple, une méthode ModifierParametreCamera par exemple permettant de modifier les paramètres de ma caméra.
Est-ce possible ? Est-ce correcte ? Comment auriez-vous fait vous autrement ?
Il est fort probable que vous n'ayez pas tout compris à où je veux en venir, ce qui est tout à fait normal, une application multitache étant rarement évidente et qui plus est ici je ne facilite pas les choses. Auquel cas, n'hésitez pas à me le faire remarquer, on essaiera de se comprendre.
Pour terminer, voila grosso modo ce que je pense faire ... est-ce quelque chose de viable ? (ne tenez pas compte de la non prise en charge des sections critiques etc ... c'est juste pour que vous voyez à peu près ce que je veux faire) :
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
Unit UPrinc;
...
interface
...
TFormPrinc = class(TForm)
// Quelques composants ...
private
// quelques variables/méthodes
protected
// quelques variables/méthodes
public
// quelques variables/méthodes
end;
var
FormPrinc: TFormPrinc;
implementation
...
procedure TFormPrinc.ClickLanceCamera(...);
begin
if threadCamera1=nil then
threadCamera1 = TThreadCamera.Create(...)
else
threadCamera.Resume;
end;
...
procedure TFormPrinc.ClickStopCamera(...)
begin
if threadCamera1<>nil then threadCamera1.Suspend;
end;
...
procedure TFormPrinc.ClickCalibrerCamera(...)
var donnees: TReglagesCamera;
begin
donnees := LancerFenetreReglage(); // Juste histoire de dire que par exemple on
// exécute une nouvelle fiche et qu'on récupère les nouveaux réglages de la caméra
threadCamera1.AppliquerReglages(donnees); // est-ce vraiment bien de faire ça ?
end;
...
end.
unit UThreadCamera;
...
interface
...
TCamera = class;
TThreadCamera = class(TThread)
private
camera: TCamera;
protected
Constructor Create(...);
procedure Execute; override;
public
procedure AppliquerReglages(donnees: TReglagesCamera);
end;
TCamera = class
private
fUnParametre: integer;
fUnAutreParametre: string;
...
protected
...
public
...
end;
implementation
...
constructor TThreadCamera.Create(...):
begin
camera := TCamera.Create(...);
FreeonTerminate := false;
...
inherited Create(...);
end;
...
procedure TThreadCamera.Execute;
begin
... // manipulation de l'objet camera et traitement des photos prises
end;
procedure TThreadCamera.AppliquerReglages(...)
begin
if Suspended then camera.AppliquerReglages(...);
end;
...
constructor TCamera.Create(...);
begin
...
end;
end. |
A la rigueur peut-être même il n'est pas nécessaire que le thread soit suspendu ... une simple protection sur les paramètres de la caméra et c'est bon ... Enfin ça c'est une autre histoire ...
Merci de m'avoir lu,
et merci à quiconque pourra m'aider ...
-----------------------------
Modification :
Je me rends compte que c'est pas forcément évident à lire le bout de code que j'ai fourni. Donc ej vais essayer de résumer ma question ainsi :
Soit une classe dérivé de TThread.
Est-il correct d'ajouter une méthode public à cette classe qui pourrait alors être appelée par le thread principal ? Conceptuellement est-ce que ça se fait ? (mon but étant de modifier des paramètres d'exécution du Thread secondaire par exemple).
Par avance merci