ответили, может кто-нибудь мог ответить ещё на один вопрос.
Насколько правильно/неправильно поступать следующим образом:
Выделяю память под объект класса в конструкторе класса виджета, создаю поток, помещаю объект в поток с помощью функции moveToThread(),создаю сигнал для функции своего класса (которая дописывает в файл с помощью QIODevice::Append), с помощью connect соединяю этот сигнал с функцией и запускаю этот сигнал по нажатию кнопки в цикле несколько раз. Это рукожопие или нормально? Спасибо
Работу с файлом лучше обернуть в QMutex, чтобы потоки не имели одновременный доступ
если это один и тот же файл, если разные - чуть усложнить: каждому файлу по mutex'у
Тогда по моему лучше в классе создать мембер qthread-a, и в конструкторе класса thread->moveToThread(this)
вынос в тред (и коннекты на завершение/удаление треда и воркера) обычно оставляю там, где этот воркер создаётся. не в конструкторе самого воркера
Если ui поток и thread связывать через сигнал/слот, то mutex не нужен
Ах да, точно. Там же в очереди
Я делаю это в конструкторе виджета
Я в деструкторе сделал методы wait и quit, не стоит?
обычно QThread::finished подключаю к deleteLater воркера и треда
MoveToThread неважно где делать: в конструкторе класса, методами которого ты пользуешься или в конструкторе виджета, где ты через кнопки будешь вызывать методы этого класса?
Во-первых Анатолий правильно сказал - никаких мьютексов не нужно, у вас же запись всегда в одном потоке. Во-вторых из вашего объяснения непонятна роль треда и объекта который вы помещаете в тред. Сигнал у вас, судя по описанию - нажатие кнопки в UI, обработчик - запись в файл. А причем здесь тред и объект в нём?
Обсуждают сегодня