Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Передать vector<vector<T>> параметром в поток


Автор: wallstreet 16.8.2012, 17:38
Добрый день.
Подскажите пожалуйста, как передать двумерный вектор в поток в качестве параметра?

Автор: borisbn 17.8.2012, 06:47
Не пойму вопроса... Передать что-то можно в функцию, а не в поток.

Автор: GremlinProg 17.8.2012, 07:52
по указателю, например с ref-счетчиком, по типу OLE-объекта,
или через глобальный вектор, с синхронизацией доступа к нему при инициализации потока,
или вообще не передавать, оставить в глобальной видимости, с синхронизацией, если не критично по времени доступа к нему,
или передавать не вектор, а указатель на интерфейс, осуществляющий над ним какую-то логику

вариантов масса,
выбор зависит от того, какая задача реализуется над этим вектором в потоке

Автор: wallstreet 17.8.2012, 11:07
ко мне приходят потоком данные из таблице по дде. 
Я их получаю, парсю, и сохраняю в двумерный вектор.
Для того, что бы иметь возможность получать не одну таблицу, а более, как я понимаю, мне необходимо выделить процесс сохранения таблиц в отдельные потоки и синхронизировать их работу между собой.
Метод класса сохраняющий приходящие таблицы по нужным векторам:
Код

void DdeData::InsertData(std::vector<std::vector<Cell>> Tbl, std::string strHsz1, short r, short c, short Rows, short Cols)
{
    if(strHsz1=="Stakan")
    {
        _beginthreadex(NULL, 0, StakanThread, &Tbl, 0, NULL);
    }
    else if( и тд)
    {
        ......
    }
}

а вот функция потока
Код

unsigned _stdcall StakanThread(void* param) // поток для сохранения стакана
{
    dd.Stakan =  (std::vector<std::vector<Cell>>*)param;
}

компилятор ругается на выделенную строку:
Цитата

Error    6    error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::vector<_Ty> *' (or there is no acceptable conversion)    c:\users\андрей\documents\visual studio 2010\projects\r4t_2\r4t\ddedatarealization.cpp    130    1    R4T

Автор: borisbn 17.8.2012, 11:14
Андрей, так делать вообще нельзя. Ты передаёшь в поток указатель на вектор, который "помрёт" по выходу из функции DdeData::InsertData.
Можно сделать как-нибудь так:
Код

void DdeData::InsertData( const std::vector<std::vector<Cell>> & Tbl, std::string strHsz1, short r, short c, short Rows, short Cols)
{
    if(strHsz1=="Stakan")
    {
        std::vector<std::vector<Cell>> * p_table = new std::vector<std::vector<Cell>>( Tbl.begin(), Tbl.end() );
        _beginthreadex(NULL, 0, StakanThread, p_table, 0, NULL);
    }
    else if( и тд)
    {
        ......
    }
}

unsigned _stdcall StakanThread(void* param) // поток для сохранения стакана
{
    dd.Stakan =  (std::vector<std::vector<Cell>>*)param;
// после того, как поработали с данными не забываем удалить то, что было выделенно с помощью new
    std::vector<std::vector<Cell>>* p_table = (std::vector<std::vector<Cell>>*)param;
    delete p_table;
}

Автор: wallstreet 17.8.2012, 12:10
Цитата(borisbn @  17.8.2012,  11:14 Найти цитируемый пост)
Можно сделать как-нибудь так:

спасибо, помогло.
Правильно я понимаю, что если существует необходимость передать несколько параметров в функцию потока, нужно передавать указатель на структуру в качестве параметра? 

Автор: borisbn 18.8.2012, 09:22
> Правильно я понимаю, что если существует необходимость передать несколько параметров в функцию потока, нужно передавать указатель на структуру в качестве параметра? 
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)