PDA

Visualizza la versione completa : [C++] Eseguire una routine ad intervalli regolari


iljakie
13-07-2017, 17:10
Salve ragazzi, devo acquisire delle immagini attraverso una camera 3D. L'azienda produttrice ha fornito un software che permette l'acquisizione di una singola immagine ad ogni avvio del programma. Modificando il file c++ vorrei fare in modo che mi vengano acquisite piu immagini attraverso un unico lancio dell'applicazione. Per fare questo ho scritto un ciclo while attraverso il quale riesco a catturare tante immagini quante sono le iterazioni del ciclo while.

Ora ho bisogno che queste immagini vengano acquisite ad intervalli regolari, ad esempio una ogni secondo per un minuto. Qualcuno ha qualche idea su come fare? Ho letto in giro su internet che posso usare la funzione clock oppure la funzione interval ma purtroppo non so come implementarla nel ciclo.

Grazie mille


int main(int argc, char* argv[])

{ int i;
i=1;



int exitCode = EXIT_FAILURE;
const char* fileName = argc > 1 ? argv[1] : "points.pcd" ;


CToFCamera camera;
try
{




CToFCamera::InitProducer();
camera.OpenFirstCamera();


CEnumerationPtr ptrComponentSelector = camera.GetParameter("ComponentSelector");
CBooleanPtr ptrComponentEnable = camera.GetParameter("ComponentEnable");
CEnumerationPtr ptrPixelFormat = camera.GetParameter("PixelFormat");


// Parameterize the camera to send 3D coordinates and intensity data
ptrComponentSelector->FromString("Range");
ptrComponentEnable->SetValue( true );
ptrPixelFormat->FromString("Coord3D_ABC32f");


ptrComponentSelector->FromString("Intensity");
ptrComponentEnable->SetValue(true);
ptrPixelFormat->FromString("Mono16");


while (i<60 )

{

// Acquire one single image
BufferParts parts;
GrabResultPtr ptrGrabResult = camera.GrabSingleImage( 1000, &parts );

// Save 3D data
if ( ptrGrabResult->status == GrabResult::Ok )
{
std::ostringstream oss;
oss << "points" << i << ".pcd";
SavePointCloud( parts, fileName );
rename("points.pcd", oss.str().c_str());

cout << fileName << endl;

}
else
{
cerr << "Failed to grab an image." << endl;
}

i++;

}
camera.Close();
exitCode = EXIT_SUCCESS;
}
catch ( GenICam::GenericException& e )
{
cerr << "Exception occurred: " << endl << e.GetDescription() << endl;
// After successfully opening the camera, the IsConnected method can be used
// to check if the device is still connected.
if ( camera.IsOpen() && ! camera.IsConnected() )
{
cerr << "Camera has been removed." << endl;
}


}


if ( CToFCamera::IsProducerInitialized() )
CToFCamera::TerminateProducer(); // Won't throw any exceptions


cout << endl << "Press Enter to exit." << endl;
while (cin.get() != '\n');


return exitCode;

}

shodan
13-07-2017, 18:06
Puoi fare cosė:


#include <chrono> // per std::chrono_literals
#include <thread> // per this_thread

using namespace std::chrono_literals;
...

while (condizione) {
std::this_thread::sleep_for(1s); // da spostare dove fa pių comodo
... etc..

}

iljakie
14-07-2017, 12:37
grazie per la risposta

purtroppo per visual basic 2010 non mi riconosce le libreirie chrono e thread :(

shodan
14-07-2017, 12:46
Visual basic? O intendi Visual Studio 2010?

iljakie
14-07-2017, 12:56
visual studio 2010, avevo sbaglaito a scrivere

shodan
14-07-2017, 13:08
Allora devi usare Sleep()
https://msdn.microsoft.com/it-it/library/windows/desktop/ms686298(v=vs.85).aspx


#include <windows.h> // per Sleep


while (condizione) {
Sleep(DWORD(60000)); // Tempo in millisecondi da spostare dove fa pių comodo
... etc..

Loading