Название: Многопоточное приложение: лог Отправлено: 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 ) 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 Ок, спасибо за наводку))
|