Oppure

Loading
16/11/06 14:31
francoo
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...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???

aaa
17/11/06 13:06
posta10100
hai provato con un fork?

for(int i=1;i<100;i++)
{// I valori vengono acquisiti in un record definito nell'header
DOUBLE_POSITION_ANGLES_RECORD record=a.getValori();
if (fork() == 0) {
//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();
} 
}


Non sono sicuro che nel tuo caso va bene... però prova!!!
aaa
18/11/06 23:35
Shutdown
Se cerchi qualcosa sui Thread in C++ puoi
divertirti usando un moduletto che ho creato io.

Ecco il sorgente:

ThreadManager.cpp
-----------------------
// File H

#include <windows.h>


// Costanti

const int MAX_THREAD = 100; // Il massimo di thread che puoi gestire



// Variabili

HANDLE Thrd[MAX_THREAD]; // Handle

DWORD ThrdId[MAX_THREAD]; // Il tipo DWORD corrisponde ad un INT

// Prototipi

int threadError( int errorCode ); // Mostra un messaggio d'errore

bool createThread( void (*method)(), int id ); // crea un nuovo thread

bool suspendThread( int id ); // sospende un thread

bool terminateThread( int id ); // termina un thread

bool waitForThread( int id, int time ); // aspetta la fine di un thread



// Messaggio d'errore

int threadError( int errorCode )

{

    // Variabili

    char* applicationName = "Karonte";

    // Controlliamo di che errore si tratta

    if( errorCode == 1 ) { MessageBox(NULL,"Errore nella creazione del Thread",applicationName,MB_OK|MB_ICONERROR); return errorCode; }

    if( errorCode == 2 ) { MessageBox(NULL,"Errore nella sospensione del Thread",applicationName,MB_OK|MB_ICONERROR); return errorCode; }

    if( errorCode == 3 ) { MessageBox(NULL,"Errore nella chiusura del Thread",applicationName,MB_OK|MB_ICONERROR); return errorCode; }

    if( errorCode == 4 ) { MessageBox(NULL,"Errore nell' attendere la fine del Thread",applicationName,MB_OK|MB_ICONERROR); return errorCode; }

    // Non restituisce errori

    return(0);

}



// Crea un nuovo thread

bool createThread( void (*method)(), int id )

{

    // Crea un thread

    Thrd[id] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)method, 0, 0, &ThrdId[id] );

    // Se il thread e' stato creato restituisce true, altrimenti false.

    return( Thrd[id] ? true : false );

}



// Sospende un thread

bool suspendThread( int id )

{

    // Sospende il thread in base all' handle

    int r = SuspendThread( Thrd[id] );

    // Se il thread e' stato sospeso restituisce true, altrimenti false.

    return( r ? true : false );

}



// Termina un thread

bool terminateThread( int id )

{

    // Exit code

    int exitCode = 0;

    // Sospende il thread in base all' handle

    int r = TerminateThread( Thrd[id], exitCode );

    // Se il thread e' stato terminato restituisce true, altrimenti false.

    return( r ? true : false );

}



// Aspetta la fine di un thread

bool waitForThread( int id, int time )

{

    // Aspetta la fine di un thread in base all' handle

    int r = WaitForSingleObject( Thrd[id], time );

    // Se la funzione ha successo restituisce true, altrimenti false.

    return( r ? true : false );

}
Ultima modifica effettuata da Shutdown 21/11/06 14:22
aaa
19/11/06 11:12
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:
aaa
20/11/06 11:48
francoo
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!!!


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?
aaa
21/11/06 14:23
Shutdown
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.
aaa
21/11/06 14:26
Shutdown
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:


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




// Sospende un thread. Si passa come
// parametro l'id del thread
// utilizzo: suspendThread( id_thread )

if( !suspendThread(0) )
   threadError(2);



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


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

Ultima modifica effettuata da Shutdown 21/11/06 14:41
aaa