Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Hellion от Август 31, 2011, 14:17



Название: Получить данные формы из потока
Отправлено: Hellion от Август 31, 2011, 14:17
Добрый всем.

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


Название: Re: Получить данные формы из потока
Отправлено: Пантер от Август 31, 2011, 14:32
Отсылка сигнала с запросом к главной форме и получение от нее сигнала со строкой.


Название: Re: Получить данные формы из потока
Отправлено: Hellion от Август 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?
...

Вообщем, может я не совсем понятно объяснил, но тогда можно пример кода, если не затруднит.


Название: Re: Получить данные формы из потока
Отправлено: popper от Август 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);
 


Название: Re: Получить данные формы из потока
Отправлено: Hellion от Сентябрь 01, 2011, 00:55
popper, спасибо.
Идея с флагом пришедших данных - это то, на чем я сам остановился, хотелось уточнить, что я не пропустил чего-то и теперь не изобретаю велосипед.

Если можно, уточните как отправить данные конкретному потоку? То есть, у нас есть его threadIdent, как теперь отправить именно ему данные?


Название: Re: Получить данные формы из потока
Отправлено: Bepec от Сентябрь 01, 2011, 07:12
Как вариант

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

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

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


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



Название: Re: Получить данные формы из потока
Отправлено: ddrtn от Сентябрь 01, 2011, 07:16
Для отправки данных конкретному потоку, вызвав один сигнал, завязанный на много слотов - QSignalMapper


Название: Re: Получить данные формы из потока
Отправлено: popper от Сентябрь 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 (http://narod.ru/disk/24096091000/2010-07-21.zip.html)