![]() |
|
|
![]()
|
|
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
Есть 3 потока:
1. основной (Mainwindow) 2. поток Potok1 3. поток Potok2 Суть следующая: в Potok1 данные задаются, затем они же используются в Potok2, после чего данные этого Potok2 отображаются в основном потоке... Как передать данные (например переменную param) из потока в поток (чтобы в Potok2 можно было прочитать param из Potok1)? подскажите пож-та на моем примере...
p.s. (не основное) - как запустить один поток из другого? если в примере выше я переносу запуск Potok2 (pt2 = new Potok2; pt2->start();) из Mainwindow в конструктор Potok1, то сразу после запуска приложения "программа неожиданно завершится с кодом...." Это сообщение отредактировал(а) gordmiand - 19.6.2010, 21:09 |
|||
|
||||
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
неужели никто не передавал данные из потока в поток (из одного метода run в другой)? поясните пож-та на примере выше как это осуществить... заранее спасибо всем за содержательные ответы... |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Если данных немного то передавай их в параметрах сигнала (сигнал не обязательно должен быть без параметров).
Если данных много, то создай структуру или класс для их хранения, выдели под них память в одном потоке через new, положи этот указатель в QSharedPointer и передай его в параметрах сигнала в другой поток. Об удалении (delete) этой структуры можешь не беспокоиться. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
borisbn: мне нужно передавать массив типа char mas[200][2000]...подскажите пож-та на моем примерчике (см. выше) как это проще всего сделать... буду ооочень признателен...
у меня что-то ну никак не получается из метода run потока potok1 испускать сигнал с параметром (т.е. моим массивом данных) и принимать его в методе run (???) потока Potok2... |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Массив char[][] передать, скорее всего, не получится. Можно скопировать его в один вектор или вектор векторов и уже этот объект передать в сигнале
а вот принимать его нужно в специальном слоте, а не в run.
не забудь connect'нуть potok1::onNewData с potok2::onNewData -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
мне в принципе все ясно – в сигнале onNewData потока Potok1 нужный массив с данными копируется в вектор, а затем сигнал испускается с этим вектором в качестве параметра. В потоке Potok2 слот onNewData принимает данные от сигнала onNewData потока Potok1 (в его слоте onNewData неизвестно v (Вы наверное просто забыли его объявить)) и записывает уже в свой массив mas[][]…
А где именно в потоке Potok2 надо “connect'нуть potok1::onNewData с potok2::onNewData”? Мне надо иметь возможность пользоваться этим массивом-вектором от Potok1 в методе run потока Potok2… И почему в моем примере (в самом начале этой темы) не было нужды передавать переменную prm потока Potok2 в качестве параметра его сигнала DataFromPotok2(), испускаемого из run(), хотя значение этой переменной будет прекрасно видно в слоте GetData() (соединенного с сигналом DataFromPotok2()) главного потока… |
|||
|
||||
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
что-то я затерялся между потоками....
ответ = 0... подскажите пож-та на этом примере что тут неправильно и как будет верно наиболее простым способом? |
|||
|
||||
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
подскажите пож-та что у меня неверно в вышеприведенном примере и как будет правильно? уже замучился с этими потоками, а сделать обмен данными между потоками ооочень надо......а на таком примерчике глядишь и разобрался бы... Это сообщение отредактировал(а) gordmiand - 22.6.2010, 21:33 |
|||
|
||||
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
borisbn: хорошо, но в Вашем примере в потоке Potok2 данные, считанные из Potok1 (через его сигнал) в слоте onNewData (массив mas) будут доступны только в этом слоте...а
как сделать так, чтобы они (данные от Potok1) были доступны для использования в run-е данного Potok2-потока?? подскажите пож-та на Вашем приведенном выше примере...буду ооочень признателен... |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
спасибо...
по поводу мьютекса - методы lock и unlоck я знаю, а зачем нужен
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
QMutexLocker - это класс, который делает lock Qmutex'а, который передан ему в конструкторе, и unlock оного в деструкторе, т.е. там, где этот класс разрушается - заканчивается область видимости этого объекта.
Реализация QMutexLocker примерно такая:
при этом заметь, что объект QMutexLocker locker( &m_mutex ); "живёт" пока не закончится выполнение функция onNewData -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
то есть получается, что "QMutexLocker - это класс, который делает lock Qmutex'а, который передан ему в конструкторе, и unlock оного в деструкторе," в то же время вдобавок к этому в программе делаем
получается 2 раза делаем lock/ unlock одного и того же мутекса, только разными способами - явно и с помощью спец. класса? |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Всё правильно. В функции onNewData необходимо залочить m_mas до конца выполнения функции, где и вызывается деструктор QMutexLocker'а, а в run нужно залочить только на время доступа к данным, а потом отпустить. Можно было и в функции onNewData сделать lock/unlock и в run сделать отдельную область видимости { QMutexLocker ... }
Я просто показал тебе оба варианта -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |