Bonjour,

initialement j'executais ceci dans une classe main.cpp

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
 
//Connexion a un serveur OPC/DCOM
CServerOPC toto(L"KepServer");
 
//Création et ajout d'un groupe au serveur OPC
CGroupOPC myOtherGroup(&toto,L"MyGroup");
 
//Définition de la liste des Items
CObArray listItem;
 
//Création de l'item
CItemOPC item(L"Canal.Device.Valeur",L"",&myOtherGroup);
 
//Ajout de l'item à la liste d'item
listItem.Add(&item);
 
//Ajout des Items au groupe
myOtherGroup.addItems(listItem);
 
//Lecture des valeurs des items ajoutés
myOtherGroup.ReadSyncIO(OPC_DS_DEVICE,listItem);
La lecture ne s'effectuait qu'une seule fois.
Voulant lire les valeurs cycliquement, toutes les secondes (pour le moment), j'ai crée (copié sur developpez.com) une classe Thread qui s'appelle CReaderThread.

La fonction Execute permet d'executer dans le thread une liste d'instructions.

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
UINT CReaderThread::Execute()
{
    // exemple de code à exécuter
 
    DWORD start = ::GetTickCount();
 
	CServerOPC toto(L"KepServer");
	CObArray listItem;
	CItemOPC item(L"Canal.Device.Valeur",L"",&myOtherGroup);
	listItem.Add(&item);
	myOtherGroup.addItems(listItem);
 
    do
    {   
        // code de traitement
		cout<<endl<<GetTickCount(); 
 
                //Lecture cyclique des threads
		myOtherGroup.ReadSyncIO(OPC_DS_DEVICE,listItem);
 
        ::Sleep( 1000 ); // simuler une opération de 1 sec
    } while ( this->m_StopThread == false ) ;
 
    DWORD end = ::GetTickCount();
 
    // renvoyer un résultat : temps d'exécution
    this->ExecutionTime = end - start;
 
    return 0;
}
Là j'ai été obligé de rajouter dans cette fonction membre la liste d'instructions suivantes qui correspond à ma liste d'instruction obligatoires avant ma lecture
CServerOPC toto(L"KepServer");
CObArray listItem;
CItemOPC item(L"Canal.Device.Valeur",L"",&myOtherGroup);
listItem.Add(&item);
myOtherGroup.addItems(listItem);
et dans la boucle, j'ai mis la fonction de lecture.

Pensez-vous que cette liste d'instructions devraient figurer dans le thread ou devrai-je la laisser dans main.cpp ?
Si je la laisse dans main.cpp, je serai obligé de passer en paramètres les objets nécessaires à l'execution de ma fonction de lecture, chose que je ne trouve pas très propre et qui fait un peu bidouillé, qu'en pensez-vous ?

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
UINT CReaderThread::Execute(CGroupOPC group,CObArray listItem,DWORD opc_ds)
{
    // exemple de code à exécuter
 
    DWORD start = ::GetTickCount();
 
    do
    {   
        // code de traitement
		cout<<endl<<GetTickCount(); 
 
                //Lecture cyclique des threads
		group.ReadSyncIO(opc_ds,listItem);
 
        ::Sleep( 1000 ); // simuler une opération de 1 sec
    } while ( this->m_StopThread == false ) ;
 
    DWORD end = ::GetTickCount();
 
    // renvoyer un résultat : temps d'exécution
    this->ExecutionTime = end - start;
 
    return 0;
}
Ou alors devrai-je modifier la fonction de lecture de ma classe CGroupOPC pour qu'elle soit executé dans un thread ?

Chose important aussi, j'aimerai par la suite dans le cas où l'appli n'est pas connecté au serveur OPC, qu'elle tente automatiquement et cycliquement de se reconnecter au serveur, d'où un nouveau thread.
C pourquoi je pense aussi que l'instruction:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
CServerOPC toto(L"KepServer");
ne pourrait pas se trouver dans le thread CReaderThread.

En esperant avoir été claire.

Merci d'avance pour vos réponses.
++