Message Original : (voir fin de ce post pour ré-expression de la question)
(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) :
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 ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
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
Partager