Asynchronous Processing¶
This code snippet shows how to read data matrix codes asynchronously from three separate images. The code in this snippet is valid for C++11 and newer.
C++¶
#include <atomic>
#include <chrono>
#include <thread>
#include <eVision/EasyMatrixCode/EasyMatrixCode2/EMatrixCodeReader.h>
// create a subroutine that reads the codes from an image
void Read(eVision::EImageBW8& image,
eVision::EasyMatrixCode2::EMatrixCodeReader& reader,
std::vector<eVision::EasyMatrixCode2::EMatrixCode>& codes,
std::atomic<bool>& finished)
{
// read the codes in this image
reader.Read(image);
// extract the results
codes = reader.GetReadResults();
// notify that the reader has finished
finished = true;
}
using namespace eVision;
namespace EMC2 = eVision::EasyMatrixCode2;
// Prepare three images
EImageBW8 img1, img2, img3;
// Prepare three matrix code readers
EMC2::EMatrixCodeReader reader1, reader2, reader3;
// Prepare three vectors of matrix code instances
std::vector<EMC2::EMatrixCode> codes1, codes2, codes3;
// Prepare three booleans to track the thread progress
std::atomic<bool> finished1, finished2, finished3;
// Load the three images
img1.Load("image1.bmp");
img2.Load("image2.bmp");
img3.Load("image3.bmp");
// Set the progress trackers to false
finished1 = false;
finished2 = false;
finished3 = false;
// Launch three threads to read the codes in each image
// the threads will run in the background.
std::thread thr1 = std::thread([&] { Read(img1, reader1, codes1, finished1); });
std::thread thr2 = std::thread([&] { Read(img2, reader2, codes2, finished2); });
std::thread thr3 = std::thread([&] { Read(img3, reader3, codes3, finished3); });
// Wait until one of the threads has finished
while (!(finished1 || finished2 || finished3))
std::this_thread::sleep_for(std::chrono::milliseconds(5));
// Here, we manually stop all code readers, they will stop processing
// even if they have not yet found the codes in the image
reader1.StopProcess();
reader2.StopProcess();
reader3.StopProcess();
// wait for the threads to completely finish before continuing
thr1.join();
thr2.join();
thr3.join();
C#¶
using System.Threading;
using eVision;
using EMC2 = eVision.EasyMatrixCode2;
static void Read(ref EImageBW8 image, ref EMC2.EMatrixCodeReader reader, ref EMC2.EMatrixCode[] codes, ref bool finished)
{
// read the codes in this image
reader.Read(image);
// extract the results
codes = reader.ReadResults;
// notify that the reader has finished
finished = true;
}
// Prepare three images
EImageBW8 img1 = new EImageBW8();
EImageBW8 img2 = new EImageBW8();
EImageBW8 img3 = new EImageBW8();
// Prepare three matrix code readers
EMC2.EMatrixCodeReader reader1 = new EMC2.EMatrixCodeReader();
EMC2.EMatrixCodeReader reader2 = new EMC2.EMatrixCodeReader();
EMC2.EMatrixCodeReader reader3 = new EMC2.EMatrixCodeReader();
// Prepare three vectors of matrix code instances
EMC2.EMatrixCode[] codes1 = null;
EMC2.EMatrixCode[] codes2 = null;
EMC2.EMatrixCode[] codes3 = null;
// Prepare three Booleans to track the thread progress
bool finished1 = false;
bool finished2 = false;
bool finished3 = false;
// load the images
img1.Load("image1.bmp");
img2.Load("image2.bmp");
img3.Load("image3.bmp");
// Launch three threads to read the codes in each image
Thread thr1 = new Thread(() => Read(ref img1, ref reader1, ref codes1, ref finished1));
Thread thr2 = new Thread(() => Read(ref img2, ref reader2, ref codes2, ref finished2));
Thread thr3 = new Thread(() => Read(ref img3, ref reader3, ref codes3, ref finished3));
// Start the threads, they will run in the background.
thr1.Start();
thr2.Start();
thr3.Start();
// Wait until one of the threads has finished
while (!(finished1 || finished2 || finished3))
Thread.Sleep(5);
// Here, we manually stop all code readers, they will stop processing
// even if they have not yet found the codes in the image
reader1.StopProcess();
reader2.StopProcess();
reader3.StopProcess();
// wait for the threads to completely finish before continuing
thr1.Join();
thr2.Join();
thr3.Join();
Python¶
from threading import Thread
import time
import eVision
from eVision import EasyMatrixCode2 as EMC2
## create a subroutine that reads the codes from an image
def Read(image: eVision.EImageBW8,
reader: EMC2.EMatrixCodeReader,
codes: list[EMC2.EMatrixCode],
finished: list[bool]):
# read the codes in the image
results = reader.Read(image)
# extract the results
codes.clear()
for res in results:
codes.append(res)
# notify that the reader has finished
finished[0] = True
# Prepare three images
img1 = eVision.EImageBW8()
img2 = eVision.EImageBW8()
img3 = eVision.EImageBW8()
# Prepare three matrix code readers
reader1 = EMC2.EMatrixCodeReader()
reader2 = EMC2.EMatrixCodeReader()
reader3 = EMC2.EMatrixCodeReader()
# Prepare three vectors of matrix code instances
codes1 = []
codes2 = []
codes3 = []
# Prepare three Booleans to track the thread progress
finished1 = [False]
finished2 = [False]
finished3 = [False]
# load the images
img1.Load("image1.bmp")
img2.Load("image2.bmp")
img3.Load("image3.bmp")
# Launch three threads to read the codes in each image
thr1 = Thread(target=Read, args=(img1, reader1, codes1, finished1))
thr2 = Thread(target=Read, args=(img2, reader2, codes2, finished2))
thr3 = Thread(target=Read, args=(img3, reader3, codes3, finished3))
# Start the threads, they will run in the background.
thr1.start()
thr2.start()
thr3.start()
# Wait until one of the threads has finished
while not (finished1[0] or finished2[0] or finished3[0]):
time.sleep(0.1)
# Here, we manually stop all code readers, they will stop processing
# even if they have not yet found the codes in the image
reader1.StopProcess()
reader2.StopProcess()
reader3.StopProcess()
# wait for the threads to completely finish before continuing
thr1.join()
thr2.join()
thr3.join()