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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Многопоточное приложение: лог  (Прочитано 5594 раз)
noi
Гость
« : Октябрь 03, 2009, 00:57 »

Подскажите какими способами можно организовать ведение общего лога многопоточного приложения. Надо, чтобы во всех потоках вызываться некая функция PutLog( QString ), а в главном окне приложения формировался общий хронологический лог. Пришло в голову организовать связной список, в который будут добавляться записи из разных потоков, а в главном потоке выводить записи и освобождать из под них память. Вообщем идея должна быть понятна моя) Может кто-нибудь подкинет идею, как это можно сделать по другому или лучше??
Записан
agor
Гость
« Ответ #1 : Октябрь 03, 2009, 07:35 »

Я, просто, вызываю функцию записи в log из разных потоков, пользуюясь QMutex ;
Точнее, я переопределил qInstallMsgHandler(), и перехватываю все qDebug(), qWarning() и.т.д  собщения этим методом и там уже пишу в лог. Работает на маскимально возможном кол-ве потоков в Qt (к сожалению, не более 1000) без сбоев отлично.
Записан
SimpleSunny
Гость
« Ответ #2 : Октябрь 03, 2009, 10:30 »

А зачем тут QMutex?
Можно из потоков испускать сигналы putLog(QString) и связать их с одним слотом в MainWindow, так как объекты в разных потоках, то никаких проблем не должно возникнуть. И главное не забыть про http://vingrad.ru/blogs/sabrog/2009/06/11/qt-45-movetothread-ili-metod-myunhgauzena/
Записан
spectre71
Гость
« Ответ #3 : Октябрь 03, 2009, 10:58 »

А зачем тут QMutex?
С QMutex для данного случая проще.
Оборачиваем оперции работы с контейнером лога одним и тем же QMutex, и можем вызывать их из любого потока. Очень просто.
Можно еще и сигнал посылать из метода добавления лога для изменения визуализации. В данном случае лучше использовать Qt::QueuedConnection


Это здесь точно не нужно.
Записан
noi
Гость
« Ответ #4 : Октябрь 03, 2009, 11:46 »

Спасибо за ответы!
Цитировать
Можно еще и сигнал посылать из метода добавления лога для изменения визуализации. В данном случае лучше использовать Qt::QueuedConnection
Не понял насчет этого..

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

Код:
putLog( QString )
{
  mutex.lock();
  generalUI->someObj->insertText( QString );
  mutex.unlock();
}

p.s. пишу на qt3
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Октябрь 03, 2009, 12:15 »

Если generalUI и someObj элементы GUI, то ответ - нет, т.к. с GUI работа должна производится из главного потока.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Октябрь 03, 2009, 12:20 »

Не понял насчет этого..

p.s. пишу на qt3

Т.к. ты пишешь на qt3, то это для тебя не важно, т.к. Qt::QueuedConnection это функционал qt4.

Для передачи лог-сообщений из потоков ты можешь слать custom event и обрабатывать его в главном потоке. См. QCustomEvent
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
noi
Гость
« Ответ #7 : Октябрь 04, 2009, 20:24 »

Ок, спасибо за наводку))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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