Мой окр. Win 10, VS 2017.
Я написал проект на c ++, который из-за необходимости имеет высокую сложность, и я тестирую собственную библиотеку, используя многопоточную обработку в основной функции.
Когда я использовал нить c ++ в коде, все было хорошо. Каждый результат был верным и одинаковым. Мне пришлось изменить поток с помощью pthread, но я не смог получить тот же результат с использованием потока c ++.
Я использую идентичный видеофайл в качестве ввода через весь 4 поток, но результаты из каждого 4 потока не совпадают. Я думаю, что некоторая логика c отсутствует для syn c, или есть некоторое прерывание между одним и другим потоком захвата. Не могли бы вы помочь мне выяснить, что происходит не так?
Или вы не могли бы порекомендовать мне другую сильную структуру для моего проекта? Я плохо разбираюсь в архитектуре .. кратко нарисую мой проект Спасибо.
Тест. cpp
#include "A_dll.hpp"
#pragma comment(lib, "A_dll.lib")
void* thread_main(void* p)
{
Arg* arg = *(Arg *)p;
std::vector<pAWarper> vecPA;
while(1){
1. opencv capture video
for( int i=0; i<10; i++){
2. **vecPA[i] = A_Create(i);**
3. **A_SetArgs(vecPA[i], x,y,z);**
4. **A_Run(vecPA[i]);**
5. **A_Stop(vecPA[i]);**
6. **A_GetResultImg(vecPA[i]);**
7. opencv display (imshow)
}
}
for( int i=0; i<10; i++){
**A_Destroy(vecPA[i]);**
}
}
int main()
{
const int THD_NUM_MAX = 4;
vector<pthread_t> vecThds(THD_NUM_MAX);
vector<Args> arg(THD_NUM_MAX);
for (int i = 0; i < THD_NUM_MAX; i++)
{
arg[i] = { i, OB_NUM_MAX };
if (pthread_create(&vecThds[i], NULL, thread_main, (void *)&arg[i]) < 0)
{
perror("error:");
exit(0);
}
}
int status;
for (int i = 0; i < THD_NUM_MAX; i++)
{
pthread_join(vecThds[i], (void **)&status);
}
}
A_dll.hpp & A_dll. cpp -> класс деформации и экспорт как dll
#include "classA.h"
typedef void* pAWarper;
__DLLTYPE pAWarper A_Create(int id)
{
classA* ptrA = new classA(id);
return (classA)ptrA;
}
__DLLTYPE void A_SetArgs(pAWarper p, x, y, z)
{
classA* ptrA = new classA(id);
ptrA->set(x,y,z);
}
__DLLTYPE void A_Run(pAWarper p)
{
classA* ptrA = new classA(id);
ptrA->start();
}
__DLLTYPE void A_Stop(pAWarper p)
{
classA* ptrA = new classA(id);
ptrA->stop();
}
__DLLTYPE void A_GetResultImg(pAWarper p, cv::Mat & res)
{
classA* ptrA = new classA(id);
ptrA->getRes(res);
}
А & А cpp
#include "B.hpp"
#include "cThread.hpp"
class classA : cThread{
void set( x,y,z);
std::unique_ptr<classB> pB;
virtual void run(){
pB->do_something();
}
}
Bh
class classB{
do_something();
}
cThread.h
#include <pthread.h>
#pragma comment(lib, "pthreadVC2.lib")
class cThread {
protected:
pthread_t mThread;
bool threadRunFlag;
public:
cThread();
virtual ~cThread();
virtual void run() = 0;
static void* run_(void*);
void Start();
void Stop();
bool IsRun();
};
cThread.cpp
#include "cThread.h"
cThread::cThread()
{
this->threadRunFlag = false;
};
cThread::~cThread()
{
if (this->IsRun())
this->Stop();
};
bool cThread::IsRun()
{
return this->threadRunFlag;
}
void* cThread::run_(void* aThis)
{
cThread* pThis = (cThread*)aThis;
if (pThis->IsRun())
{
pThis->run();
}
return 0;
};
void cThread::Start()
{
this->threadRunFlag = true;
pthread_create(&mThread, NULL, &cThread::run_, (void*)this);
}
void cThread::Stop()
{
this->threadRunFlag = false;
pthread_join(mThread, NULL);
};