Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передать vector<vector<T>> параметром в поток 
V
    Опции темы
wallstreet
Дата 16.8.2012, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
borisbn
Дата 17.8.2012, 06:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
GremlinProg
Дата 17.8.2012, 07:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
wallstreet
Дата 17.8.2012, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



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

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


Это сообщение отредактировал(а) wallstreet - 17.8.2012, 11:09
PM MAIL   Вверх
borisbn
Дата 17.8.2012, 11:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



Андрей, так делать вообще нельзя. Ты передаёшь в поток указатель на вектор, который "помрёт" по выходу из функции 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;
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
wallstreet
Дата 17.8.2012, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



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

спасибо, помогло.
Правильно я понимаю, что если существует необходимость передать несколько параметров в функцию потока, нужно передавать указатель на структуру в качестве параметра? 
PM MAIL   Вверх
borisbn
Дата 18.8.2012, 09:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 6
Всего: 135



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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.