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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Вызов сигнала в главном потоке  (Прочитано 9780 раз)
Bepec
Гость
« Ответ #15 : Август 16, 2012, 09:58 »

Проще выражаясь - у тебя всё уже готово, надо просто перенести часть, ответственную за подсовывание документов вынести в основной поток.

PS ага )
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Август 16, 2012, 12:25 »

Я не совсем понимаю вашу мысль. Поиск производится сразу по всем документам. Если главная нитка будет перебирать все документы и посылать их в SearchThread, то она не сможет реагировать на действия юзера.
Главная нитка запускает SearchThread и делает напр emit SearchDoc(doc[ i ]) столько раз сколько есть документов, после этого она свободна.  Посланные документы (указатели) оказались в очереди событий (EventLoop) SearchThread, т.е. документы для поиска ему приходят один за одним

Также главная нитка может послать NULL документ. Увидев его SearchThread понимает - больше доков не будет и выходит из run послав сигнал "поиск завершен"
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #17 : Август 16, 2012, 14:53 »

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

Код:
Mediator::Mediator() {
QObject::connect(thread, SIGNAL(finished()), this, SLOT(processSearchQueue()));
}

void Mediator::StartSearch() {
searchQueue = docs; // Копируем список всех документов в свою очередь
processSearchQueue();
}

void Mediator::processSearchQueue() {
if (thread->isRunning()) {return;}
if (searchQueue.isEmpty()) {
searchDoc = 0;
return;
}

Document* d = searchQueue.takeFirst();
searchDoc = d; // запоминаем, в каком документе в данный момент производится поиск
thread->SetDoc(d);
thread->start();
}

void Mediator::DeletingDocument(Document* d) { // удаление документа

while(searchDoc == d) { // если в данный момент ищем в нём, то подождем, пока не закончится поиск
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
}

searchQueue.removeOne(d);
delete d;
}

Не слишком коряво?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Август 16, 2012, 15:32 »

Ну "достаточно коряво" Улыбающийся  Перезапуск нитки на каждый документ - удовольствие дорогое, да и непонятно кто будет все время толкать processSearchQueue
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #19 : Август 16, 2012, 15:49 »

processSearchQueue первый раз запускается из метода StartSearch, а потом он запускается по сигналу finished() треда.

Больше в голову не приходит как сделать.
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #20 : Август 16, 2012, 16:02 »

Главная нитка запускает SearchThread и делает напр emit SearchDoc(doc[ i ]) столько раз сколько есть документов, после этого она свободна.  Посланные документы (указатели) оказались в очереди событий (EventLoop) SearchThread, т.е. документы для поиска ему приходят один за одним
В этом случае будет использовано прямое соединение, а не очередь
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Август 17, 2012, 11:44 »

В этом случае будет использовано прямое соединение, а не очередь
Так надо сделать moveToThread. Удаление можно так:

- при завершении поиска в документе SearchThread  испускает сигнал "поиск закончен". Главная нитка, поймав этот сигнал, смотрит - если документ помечен к удалению - удалить его. Также SearchThread  может закруглиться с поиском увидев маркер удаления. В общем с байтом флажков у документа получается покороче, но и Ваш вариант рабочий.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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