P_Kimchi
P_Kimchi

Reputation: 13

Storing and writing vector to queue c++

#include <iostream>
#include <queue>
#include <thread>
#include <process.h>
#include <windows.h>
#include <stdlib.h>

int g_Width = 100;

std::queue<std::vector<unsigned short>> BufferQueue;

bool dataRead = false;

unsigned short* g_pImgBuf = NULL;


unsigned int _stdcall Write(void* arg) {


    std::vector<unsigned short> data;
    data.reserve(g_Width);


    int line = 0;
    while (dataRead)
    {
        if (!dataRead)
            break;
        for (int i = 0; i < g_Width; i++) {
            data.push_back(i);    
        }

   

        BufferQueue.push(data);
        data.clear();

    }

    _endthreadex(0);
    return 0;

}

unsigned  int _stdcall Read(void* arg) {


    std::vector<unsigned short> data;
    data.reserve(g_Width);


    unsigned short color = 0;

    int line = 0;

    while (dataRead)
    {
        g_pImgBuf = new unsigned short[g_Width];


        if (!BufferQueue.empty()) {
            data = BufferQueue.front();
            BufferQueue.pop();

        }
        else if (!dataRead)
            break;
        else {
            continue;
        }

      

        for (int j = 0; j < g_Width; j++) {
            color = data[j];
            color += 2;
            g_pImgBuf[j] = color;
        }

        data.clear();
    }


    if (g_pImgBuf) { free(g_pImgBuf); g_pImgBuf = NULL; }


    _endthreadex(0);
    return 0;

}


int main()
{

    dataRead = true;

    HANDLE r_hThread = NULL;
    unsigned  r_threadID;
    r_hThread = (HANDLE)_beginthreadex(NULL, 0, Read, NULL, 0, &r_threadID);

    HANDLE w_hThread = NULL;
    unsigned  w_threadID;
    w_hThread = (HANDLE)_beginthreadex(NULL, 0, Write, NULL, 0, &w_threadID);

   


    while (true)
    {
        Sleep(100);
    }

}

The following error occurred vector subscript out of range 1501 error

In the middle of the thread function Give it sleep (2) and it works sometimes but soon I get an error.

If the vector is the problem, is there any other way to store the array in the queue?

I don't know where the problem is

Is there a good way?

Upvotes: 1

Views: 111

Answers (1)

pm100
pm100

Reputation: 50110

You simply cannot do this in such a simplistic way. If you want one thread to pick messages off the queue that are being written by another thread you need mtuexes and condition variables. This is not a trivial task. I suggest a lot of googling. I will look too and updat here if I find a good link

https://juanchopanzacpp.wordpress.com/2013/02/26/concurrent-queue-c11/

https://gist.github.com/ictlyh/f8473ad0cb1008c6b32c41f3dea98ef5

Upvotes: 1

Related Questions