Как использовать pthread прямо в моем проекте? Мне нужна нить в потоке. (с opencv) - PullRequest
0 голосов
/ 03 апреля 2020

Мой окр. 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);
};
...