Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Thread
Forum - C/C++ - Thread

Avatar
francoo (Normal User)
Newbie


Messaggi: 2
Iscritto: 16/11/2006

Segnala al moderatore
Postato alle 15:31
Giovedì, 16/11/2006
Salve a tutti....
sono nuovo delforum.. è il mio primo post...

Ho un problema...
Sto sviluppando un'applicazione che prende valori da un sensore di posizione collegato tramite l'USB e visualizza in real-time la posizione. L'oggetto visualizzato è un cono che cambia (...ops dovrebbe cambiare ) posizione in una finestra di rendering...

Ho a disposizione tutte le routine e le librerie del sensore che permettono l'acquisizione dei dati. L'ho provato facendo un programmino a linea di comando e funziona tutto perfettamente.

Per il rendering sto utilizzando le VTK...http://www.vtk.org
Una volta visualizzato il cono, quando do il RUN (ovvero gli chiedo di aggiornare la posizione in base ai vaolri acquisiti), il cono si blocca e solo quando il sensore finisce con l'acquisizione il cono si porta sull'ultima posizione acquisita.

questa è la funzione chiamata...

void vtkPVWindow::RUN()
{
//Inizializzazione del sistema di acquisizione
BirdClass a = BirdClass::BirdClass();

//acquisizione di 100 valori
for(int i=1;i<100;i++)
{// I valori vengono acquisiti in un record definito nell'header
DOUBLE_POSITION_ANGLES_RECORD record=a.getValori();
//Al cono è associato un Actor che ha i metodi per settare la posizione .. this->MainView->GetRenderer()->GetActors()->GetLastActor()->SetPosition(record.x,record.y,record.z);
this->MainView->Render();
}
}

secopndo me si dovrebbe lavorare con i thread... in modo tale che nn si blocchi il sistema quando sta acquisendo i dati...

Ho provato a trovare un po in giro.. ma nn ci sto capendo più niente...

come si dovrebbe fare in questo caso???


PM Quote
Avatar
posta10100 (Normal User)
Rookie


Messaggi: 27
Iscritto: 23/10/2006

Segnala al moderatore
Postato alle 14:06
Venerdì, 17/11/2006
hai provato con un fork?

Codice sorgente - presumibilmente C/C++

  1. for(int i=1;i<100;i++)
  2. {// I valori vengono acquisiti in un record definito nell'header
  3. DOUBLE_POSITION_ANGLES_RECORD record=a.getValori();
  4. if (fork() == 0) {
  5. //Al cono è associato un Actor che ha i metodi per settare la posizione .. this->MainView->GetRenderer()->GetActors()->GetLastActor()->SetPosition(record.x,record.y,record.z);
  6. this->MainView->Render();
  7. }
  8. }



Non sono sicuro che nel tuo caso va bene... però prova!!!

PM Quote
Avatar
Shutdown (Founder Member)
Guru


Messaggi: 1212
Iscritto: 10/09/2005

Segnala al moderatore
Postato alle 0:35
Domenica, 19/11/2006
Se cerchi qualcosa sui Thread in C++ puoi
divertirti usando un moduletto che ho creato io.

Ecco il sorgente:

ThreadManager.cpp
-----------------------
Codice sorgente - presumibilmente C++

  1. // File H
  2.  
  3. #include <windows.h>
  4.  
  5.  
  6. // Costanti
  7.  
  8. const int MAX_THREAD = 100; // Il massimo di thread che puoi gestire
  9.  
  10.  
  11.  
  12. // Variabili
  13.  
  14. HANDLE Thrd[MAX_THREAD]; // Handle
  15.  
  16. DWORD ThrdId[MAX_THREAD]; // Il tipo DWORD corrisponde ad un INT
  17.  
  18. // Prototipi
  19.  
  20. int threadError( int errorCode ); // Mostra un messaggio d'errore
  21.  
  22. bool createThread( void (*method)(), int id ); // crea un nuovo thread
  23.  
  24. bool suspendThread( int id ); // sospende un thread
  25.  
  26. bool terminateThread( int id ); // termina un thread
  27.  
  28. bool waitForThread( int id, int time ); // aspetta la fine di un thread
  29.  
  30.  
  31.  
  32. // Messaggio d'errore
  33.  
  34. int threadError( int errorCode )
  35.  
  36. {
  37.  
  38.     // Variabili
  39.  
  40.     char* applicationName = "Karonte";
  41.  
  42.     // Controlliamo di che errore si tratta
  43.  
  44.     if( errorCode == 1 ) { MessageBox(NULL,"Errore nella creazione del Thread",applicationName,MB_OK|MB_ICONERROR); return errorCode; }
  45.  
  46.     if( errorCode == 2 ) { MessageBox(NULL,"Errore nella sospensione del Thread",applicationName,MB_OK|MB_ICONERROR); return errorCode; }
  47.  
  48.     if( errorCode == 3 ) { MessageBox(NULL,"Errore nella chiusura del Thread",applicationName,MB_OK|MB_ICONERROR); return errorCode; }
  49.  
  50.     if( errorCode == 4 ) { MessageBox(NULL,"Errore nell' attendere la fine del Thread",applicationName,MB_OK|MB_ICONERROR); return errorCode; }
  51.  
  52.     // Non restituisce errori
  53.  
  54.     return(0);
  55.  
  56. }
  57.  
  58.  
  59.  
  60. // Crea un nuovo thread
  61.  
  62. bool createThread( void (*method)(), int id )
  63.  
  64. {
  65.  
  66.     // Crea un thread
  67.  
  68.     Thrd[id] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)method, 0, 0, &ThrdId[id] );
  69.  
  70.     // Se il thread e' stato creato restituisce true, altrimenti false.
  71.  
  72.     return( Thrd[id] ? true : false );
  73.  
  74. }
  75.  
  76.  
  77.  
  78. // Sospende un thread
  79.  
  80. bool suspendThread( int id )
  81.  
  82. {
  83.  
  84.     // Sospende il thread in base all' handle
  85.  
  86.     int r = SuspendThread( Thrd[id] );
  87.  
  88.     // Se il thread e' stato sospeso restituisce true, altrimenti false.
  89.  
  90.     return( r ? true : false );
  91.  
  92. }
  93.  
  94.  
  95.  
  96. // Termina un thread
  97.  
  98. bool terminateThread( int id )
  99.  
  100. {
  101.  
  102.     // Exit code
  103.  
  104.     int exitCode = 0;
  105.  
  106.     // Sospende il thread in base all' handle
  107.  
  108.     int r = TerminateThread( Thrd[id], exitCode );
  109.  
  110.     // Se il thread e' stato terminato restituisce true, altrimenti false.
  111.  
  112.     return( r ? true : false );
  113.  
  114. }
  115.  
  116.  
  117.  
  118. // Aspetta la fine di un thread
  119.  
  120. bool waitForThread( int id, int time )
  121.  
  122. {
  123.  
  124.     // Aspetta la fine di un thread in base all' handle
  125.  
  126.     int r = WaitForSingleObject( Thrd[id], time );
  127.  
  128.     // Se la funzione ha successo restituisce true, altrimenti false.
  129.  
  130.     return( r ? true : false );
  131.  
  132. }


Ultima modifica effettuata da Shutdown il 21/11/2006 alle 15:22
PM Quote
Avatar
Fr3d3R!K (Ex-Member)
Expert


Messaggi: 589
Iscritto: 17/08/2006

Segnala al moderatore
Postato alle 12:12
Domenica, 19/11/2006
:ot:
mi spiegate che ci sta a fare il tag  se nessuno lo usa??? per chi non lo sapesse tutti i codici di tutti i linguaggi si mettono dentro questo tag ad esempio...
codice c/c++/c#/java/perl/ecc...
è una rottura dover usare la barra di scorrimento orizzontale perchè il layout del topic va a farsi friggere...quindi magari successivamente usatelo...
grazie!
p.s. se modificate anche i vostri messaggi attuali è meglio :k:
:ot:

PM Quote
Avatar
francoo (Normal User)
Newbie


Messaggi: 2
Iscritto: 16/11/2006

Segnala al moderatore
Postato alle 12:48
Lunedì, 20/11/2006
Testo quotato

Postato originariamente da posta10100:
   hai provato con un fork?



Mi da errore...
1>..\Win32Cone.cxx(182) : error C3861: 'fork': identifier not found
Ho visto un po in giro e forse serve da includere <unistd.h>, però io sto lavorando sotto windows e con visual c++, nn ho questa libreria!!!


Testo quotato

Postato originariamente da Shutdown:
   Se cerchi qualcosa sui Thread in C++ puoi
   divertirti usando un moduletto che ho creato io.



Mi potresti dare qualche esempio di come utilizzarlo?

PM Quote
Avatar
Shutdown (Founder Member)
Guru


Messaggi: 1212
Iscritto: 10/09/2005

Segnala al moderatore
Postato alle 15:23
Martedì, 21/11/2006
Testo quotato

Postato originariamente da Fr3d3R!K:

:ot:
mi spiegate che ci sta a fare il tag  se nessuno lo usa??? per chi non lo sapesse tutti i codici di tutti i linguaggi si mettono dentro questo tag ad esempio...
codice c/c++/c#/java/perl/ecc...
è una rottura dover usare la barra di scorrimento orizzontale perchè il layout del topic va a farsi friggere...quindi magari successivamente usatelo...
grazie!
p.s. se modificate anche i vostri messaggi attuali è meglio :k:
:ot:



Fatto.

PM Quote
Avatar
Shutdown (Founder Member)
Guru


Messaggi: 1212
Iscritto: 10/09/2005

Segnala al moderatore
Postato alle 15:26
Martedì, 21/11/2006
Testo quotato

Postato originariamente da Fr3d3R!K:

:ot:
mi spiegate che ci sta a fare il tag  se nessuno lo usa??? per chi non lo sapesse tutti i codici di tutti i linguaggi si mettono dentro questo tag ad esempio...
codice c/c++/c#/java/perl/ecc...
è una rottura dover usare la barra di scorrimento orizzontale perchè il layout del topic va a farsi friggere...quindi magari successivamente usatelo...
grazie!
p.s. se modificate anche i vostri messaggi attuali è meglio :k:
:ot:



Ecco un esempio:

Codice sorgente - presumibilmente Plain Text

  1. // CREO UN NUOVO THREAD E GLI ASSEGNO
  2.     // L' ID 0
  3.     // utilizzo: createThread( funzione, id_thread )
  4.     // SE IL THREAD NON VIENE CREATO
  5.     if( !createThread(mia_funzione_void,0) )
  6.         threadError(1); // codice di errore



Codice sorgente - presumibilmente C/C++

  1. // Sospende un thread. Si passa come
  2. // parametro l'id del thread
  3. // utilizzo: suspendThread( id_thread )
  4.  
  5. if( !suspendThread(0) )
  6.    threadError(2);



E' uguale per tutte le altre funzioni, basta
inserire l'id del thread.

Codice sorgente - presumibilmente C/C++

  1. // Blocca un thread per un determinato tempo.
  2. // utilizzo: waitForThread( int id, int time )
  3. // Blocca il thread all'infinito.
  4. if( !waitForThread(0, INFINITE) ) // se non viene bloccato
  5.    threadError(4); // Codice errore


Ultima modifica effettuata da Shutdown il 21/11/2006 alle 15:41
PM Quote