Как использовать QObject в qthread и mainthread, чтобы избежать "glibc обнаружил двойное освобождение или повреждение (fasttop):"? - PullRequest
0 голосов
/ 25 февраля 2010

У меня есть qthread, который использует сокет udp для записи и чтения дейтаграмм в цикле.QUDPSocket создается в mainthread.Как мне обрабатывать объекты QObject, которые я буду использовать как в QThread, так и в mainthread.Также нормально ли иметь сокет UDP в mainthread и использовать его в qthread?

1 Ответ

2 голосов
/ 25 февраля 2010

Как правило, вы должны разрешить только одному потоку иметь дело с каждым QObject. В этом случае вы, вероятно, захотите, чтобы ваш QThread держал и использовал QUDPSocket, а основной поток никогда его не трогал (в идеале основной поток даже не должен содержать указатель на QUDPSocket, просто чтобы быть уверенным, что вы никогда забыть и случайно вызвать метод из неправильного потока).

Когда ваш QThread читает некоторые данные UDP, он может выполнить любую начальную обработку с ним, а затем передать данные в основной поток через QApplication :: postEvent () или через соединение сигнал / слот в очереди.

Аналогично, если ваш основной поток имеет некоторые данные, которые он хотел бы отправить в виде UDP-пакета, он не должен напрямую вызывать write () для объекта QUDPSocket; вместо этого он должен уведомить QThread (через postEvent () или сигнал в очереди) и позволить QThread обработать его.

...