Qt C++ Отдельный лог qDebug в файл для каждого потока - как реализовать?
Мне необходимо реализовать вывод qDebug() в разные файлы для всех потоков. То есть, для каждого потока свой текстовый файл.
Знаю, что сначала необходимо реализовать
void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message)
Реализация многопоточности унаследована от QThread. Переопределён метод run().
Проблема в том, что я не знаю, как определить, какой именно поток вызвал qDebug(), и поэтому в какой именно файл писать полученное сообщение - непонятно.
Как можно решить эту проблему?
Ответы (2 шт):
При помощи конструктора QDebug::QDebug(QIODevice *device) создайте отдельный QDebug для каждого потока и работайте с ним.
class SomeThread {
void run() {
QString filename = "thread1.log";
QFile file(filename);
if(!file->open(QIODevice::WriteOnly | QIODevice::Append)){
// Проблемы с созданием файла
} else {
QDebug log(file);
log << "запись";
...
}
}
}
Вызов вашего перехватчика сообщений осуществляется в том потоке, в котором произошел вызов qDebug() без дополнительной синхронизации. Поэтому достаточно запросить ID текущего потока изнутри messageHandler.
QFile& outSteamsByThreadId()
{
static std::map< Qt::HANDLE, QFile> ret;
static QMutex m;
QMutexLocker locker(&m);
return ret[QThread::currentThreadId()];
}
void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &message)
{
QFile& out = outSteamsByThreadId();
if(!out.isOpen())
out.open( ... );
std::cout<< ... ;
}