From 0c0a424b3bc440b128e997e1d934b125e6aed28b Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Thu, 3 Jul 2014 12:16:42 -0400 Subject: [PATCH] Replaced threading with forking. Performance is significantly improved --- src/daemon.cpp | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/daemon.cpp b/src/daemon.cpp index b33f508..6406512 100644 --- a/src/daemon.cpp +++ b/src/daemon.cpp @@ -161,23 +161,36 @@ int main( int argc, const char** argv ) LOG4CPLUS_INFO(logger, "Using: " << imageFolder << " for storing valid plate images"); + pid_t pid; + for (int i = 0; i < stream_urls.size(); i++) { - CaptureThreadData* tdata = new CaptureThreadData(); - tdata->stream_url = stream_urls[i]; - tdata->camera_id = i + 1; - tdata->config_file = configFile; - tdata->output_image_folder = imageFolder; - tdata->country_code = country; - tdata->site_id = site_id; - - tthread::thread* t = new tthread::thread(streamRecognitionThread, (void*) tdata); + pid = fork(); + if (pid == (pid_t) 0) + { + // This is the child process, kick off the capture data and upload threads + CaptureThreadData* tdata = new CaptureThreadData(); + tdata->stream_url = stream_urls[i]; + tdata->camera_id = i + 1; + tdata->config_file = configFile; + tdata->output_image_folder = imageFolder; + tdata->country_code = country; + tdata->site_id = site_id; + + tthread::thread* thread_recognize = new tthread::thread(streamRecognitionThread, (void*) tdata); + + // Kick off the data upload thread + UploadThreadData* udata = new UploadThreadData(); + udata->upload_url = upload_url; + tthread::thread* thread_upload = new tthread::thread(dataUploadThread, (void*) udata ); + + break; + } + + // Parent process will continue and spawn more children } - // Kick off the data upload thread - UploadThreadData* udata = new UploadThreadData(); - udata->upload_url = upload_url; - tthread::thread* t = new tthread::thread(dataUploadThread, (void*) udata ); + while (daemon_active) { @@ -225,6 +238,10 @@ void streamRecognitionThread(void* arg) getTime(&endTime); double totalProcessingTime = diffclock(startTime, endTime); + std::stringstream ss; + ss << "Processed frame in: " << totalProcessingTime << " ms."; + LOG4CPLUS_INFO(logger, ss.str()); + if (results.size() > 0) { // Create a UUID for the image