Russian Qt Forum
Ноябрь 27, 2024, 07:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Получить данные формы из потока  (Прочитано 6020 раз)
Hellion
Гость
« : Август 31, 2011, 14:17 »

Добрый всем.

Есть форма, на ней текстедит.
Есть Х потоков, каждый из которых должен получить следующую строку из едита и что-нибудь с ней сделать.
Как реализовать получение данных из главной формы?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 31, 2011, 14:32 »

Отсылка сигнала с запросом к главной форме и получение от нее сигнала со строкой.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Hellion
Гость
« Ответ #2 : Август 31, 2011, 17:53 »

Это я пытался делать. Проблема в том, как правильно тогда ожидать приход данных и отправить данные через сигнал именно этому потоку.
Например

Код
C++ (Qt)
...
connect(x, SIGNAL(NeedData()), this, SLOT(onNeedData()));
...
void onNeedData()
{
// kak cherez emit otoslat dannie imenno tomu potoku, kotoriy prislal signal?
}
Код
C++ (Qt)
...
emit NeedData();
// zaprosili dannie, no kak uznat chto oni uzhe uspeli priyti?
...

Вообщем, может я не совсем понятно объяснил, но тогда можно пример кода, если не затруднит.
Записан
popper
Гость
« Ответ #3 : Август 31, 2011, 22:50 »

может быть, для определения потока-эмиттера поможет QSignalMapper? Например, слот будет таким:
Код
C++ (Qt)
void onNeedData(int threadIdent)
{
 // use threadIdent to identify sender
}
 
а в конструкторе:
Код
C++ (Qt)
  signalMapper = new QSignalMapper(this);
  for (int i = 0; i < threads_count; ++i) {
        QMyThread *thread = new QMyThread(i);
        connect(thread, SIGNAL(needData()), signalMapper, SLOT(map()));
        signalMapper->setMapping(thread, i);
     }
   connect(signalMapper, SIGNAL(mapped(int)),
            this, SIGNAL(onNeedData(int)));
 


Код
C++ (Qt)
...
emit NeedData();
// zaprosili dannie, no kak uznat chto oni uzhe uspeli priyti?
...

может достаточно в открытой секции класса потока объявить флаг:
Код
C++ (Qt)
volatile bool dataReady;
 

и дергать его из основного потока, а в потоке-эмиттере:
Код
C++ (Qt)
dataReady = false;
emit NeedData();
while (!dataReady)  sleep(timeout);
 
« Последнее редактирование: Август 31, 2011, 23:18 от popper » Записан
Hellion
Гость
« Ответ #4 : Сентябрь 01, 2011, 00:55 »

popper, спасибо.
Идея с флагом пришедших данных - это то, на чем я сам остановился, хотелось уточнить, что я не пропустил чего-то и теперь не изобретаю велосипед.

Если можно, уточните как отправить данные конкретному потоку? То есть, у нас есть его threadIdent, как теперь отправить именно ему данные?
Записан
Bepec
Гость
« Ответ #5 : Сентябрь 01, 2011, 07:12 »

Как вариант

Код:
void onNeedData(int threadIdent). 
{
     ...  // посылка сигнала с параметром
}

а в потоках сделать процедуру отсева, если переменная сигнала не будет равна переменной сигнала.

Код:
void onNeedData(int threadIdent). 
{
     if (threadIdent == treadIdentificator)
     {
          ...  // вызов обработки
     }
}


Сигнал подсоединить к X потокам и каждый будет обрабатывать только свой сигнал.

« Последнее редактирование: Сентябрь 01, 2011, 07:15 от Bepec » Записан
ddrtn
Гость
« Ответ #6 : Сентябрь 01, 2011, 07:16 »

Для отправки данных конкретному потоку, вызвав один сигнал, завязанный на много слотов - QSignalMapper
Записан
popper
Гость
« Ответ #7 : Сентябрь 01, 2011, 10:23 »

как вариант, в открытой секции класса потока объявить дополнительно:
Код
C++ (Qt)
QString dataBuffer;
QMutex mutex;  // may be QMutexLocker or QReadWriteLock
 


тогда в слоте основного потока:
Код
C++ (Qt)
void onNeedData(int threadIdent)
{
 // use threadIdent to identify sender
 QMyThread *thread = findThreadFromThreadListByIdent(threadIdent);
 QString dataToThread;
 prepareData(dataToThread);
 thread->mutex->lock();
 thread->dataBuffer = dataToThread;
 thread->mutex->unlock();
 thread->dataReady = true;
}
 

а в потоке после того, как флаг готовности данных dataReady будет установлен:
Код
C++ (Qt)
dataReady = false;
emit NeedData();
while (!dataReady)  sleep(timeout);
mutex->lock();
processData(dataBuffer);
mutex->unlock();
 

Возможно, в Qt есть более изящные решения. Неплохо про потоки написано в Advanced Qt Programming
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.384 секунд. Запросов: 23.