Russian Qt Forum

Qt => Общие вопросы => Тема начата: noi от Октябрь 03, 2009, 00:57



Название: Многопоточное приложение: лог
Отправлено: noi от Октябрь 03, 2009, 00:57
Подскажите какими способами можно организовать ведение общего лога многопоточного приложения. Надо, чтобы во всех потоках вызываться некая функция PutLog( QString ), а в главном окне приложения формировался общий хронологический лог. Пришло в голову организовать связной список, в который будут добавляться записи из разных потоков, а в главном потоке выводить записи и освобождать из под них память. Вообщем идея должна быть понятна моя) Может кто-нибудь подкинет идею, как это можно сделать по другому или лучше??


Название: Re: Многопоточное приложение: лог
Отправлено: agor от Октябрь 03, 2009, 07:35
Я, просто, вызываю функцию записи в log из разных потоков, пользуюясь QMutex ;
Точнее, я переопределил qInstallMsgHandler(), и перехватываю все qDebug(), qWarning() и.т.д  собщения этим методом и там уже пишу в лог. Работает на маскимально возможном кол-ве потоков в Qt (к сожалению, не более 1000) без сбоев отлично.


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


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

И главное не забыть про http://vingrad.ru/blogs/sabrog/2009/06/11/qt-45-movetothread-ili-metod-myunhgauzena/ (http://vingrad.ru/blogs/sabrog/2009/06/11/qt-45-movetothread-ili-metod-myunhgauzena/)

Это здесь точно не нужно.


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

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

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

p.s. пишу на qt3


Название: Re: Многопоточное приложение: лог
Отправлено: pastor от Октябрь 03, 2009, 12:15
Если generalUI и someObj элементы GUI, то ответ - нет, т.к. с GUI работа должна производится из главного потока.


Название: Re: Многопоточное приложение: лог
Отправлено: pastor от Октябрь 03, 2009, 12:20
Не понял насчет этого..

p.s. пишу на qt3

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

Для передачи лог-сообщений из потоков ты можешь слать custom event и обрабатывать его в главном потоке. См. QCustomEvent (http://qt.nokia.com/doc/3.3/qcustomevent.html)


Название: Re: Многопоточное приложение: лог
Отправлено: noi от Октябрь 04, 2009, 20:24
Ок, спасибо за наводку))