Russian Qt Forum
Май 22, 2024, 20:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Некорректное поведение многопоточной программы  (Прочитано 9580 раз)
xaleva
Гость
« Ответ #15 : Февраль 16, 2011, 12:29 »

Да, я как то ставил кажется такой блог. Он выдает тоже самое.По правде говоря момент,что readAll не правильно работает меня волнует,но не так сильно.Главное узнать,не происходит ли зацикливание в следствие не правильно организованной работы с потоками. Но учитывая,что та часть кода ни у кого нареканий не вызывает,как и у меня,думаю надо искать причину в чем то другом...
Записан
BRE
Гость
« Ответ #16 : Февраль 16, 2011, 12:43 »

Но учитывая,что та часть кода ни у кого нареканий не вызывает,как и у меня,думаю надо искать причину в чем то другом...
Ну не знаю про какую часть кода идет речь, но если про ту часть, что в ответе # 2, то возникает вопрос:
Перетаскивается ли объект класса TerminalThread в контекст этого потока и в продолжении его...
Проверял ли ты в контексте какого потока выполняется слот slotSocketConnected?
Записан
xaleva
Гость
« Ответ #17 : Февраль 16, 2011, 13:02 »

Цитировать
1.Перетаскивается ли объект класса TerminalThread в контекст этого потока и в продолжении его...

Да, вообще,если не ошибаюсь все объекты,созданные в методе run автоматически пренадлежат этому потоку
Код:
TerminalThread::TerminalThread (TerminalObject& terminal) :
        QThread (),
        _terminalObject (terminal)
{
    moveToThread (this);
}
void TerminalThread::run ()
{
    Terminal _terminal (_terminalObject);
    _terminal.moveToThread (this);
...
Как видно,я на всякий случай даже вставил moveToThread.

Цитировать
Проверял ли ты в контексте какого потока выполняется слот slotSocketConnected?

Да, путем вывода во всех функциях Terminal qDebug () << thread()->currentThreadId();
id не совпадал естестно с айди главного потока....вот,поэтому даже не знаю что и предположить.
Записан
BRE
Гость
« Ответ #18 : Февраль 16, 2011, 13:13 »

Да, вообще,если не ошибаюсь все объекты,созданные в методе run автоматически пренадлежат этому потоку
Те что созданы в run принадлежат этому потоку, но сам объект класса TerminalThread будет принадлежать тому потоку в котором он создавался (например, главному), пока не перенесешь его методом moveToThread. Для правильного соединения сигнал-слот это важно.

Нужно попытаться отследить всю цепочку данных: от слота приема и до последнего получателя, контролируя целостность данных. Добавь во все методы-участники этого обмена qDebug и смотри на каком этапе что теряется.
Записан
xaleva
Гость
« Ответ #19 : Февраль 16, 2011, 17:12 »

Код:

TerminalThread::TerminalThread (TerminalObject& terminal) :
        QThread (),
        _terminalObject (terminal)
{
    qDebug () << "New thread" << thread()->currentThreadId();
    moveToThread (this);
    qDebug () << "New thread2" << thread()->currentThreadId();
}



Запись New thread и New thread2 выводят у всех потоков одну и ту же цифру.Значит ли это что сам объект класса TerminalThread не принадлежит созданному потоку?Если да, то что я должен для этого сделать?
Записан
BRE
Гость
« Ответ #20 : Февраль 16, 2011, 18:01 »

Значит ли это что сам объект класса TerminalThread не принадлежит созданному потоку?Если да, то что я должен для этого сделать?
Все потоки работают в одном адресном пространстве, поэтому вся память (все объекты) у них общие.
Само понятие контекст потока помогает Qt правильно выполнить подключение сигналов и слотов. Ничего никуда реально не переноситься.
После вызова moveToThread для объекта TerminalThread, все сигналы от объектов из других потоков будут приходить через его очередь сообщений.

Цифры одинаковы потому, что поток реально формируется только во время его запуска (вызова QThread::start), а не при создании объекта QThread.
« Последнее редактирование: Февраль 16, 2011, 18:03 от BRE » Записан
xaleva
Гость
« Ответ #21 : Февраль 16, 2011, 19:21 »

 Улыбающийся да, знаю.Подобные мысли приходят только от безисходности.
Записан
BRE
Гость
« Ответ #22 : Февраль 16, 2011, 19:34 »

Улыбающийся да, знаю.Подобные мысли приходят только от безисходности.
Попробуй сделать новый тестовый проект, убери все потоки, добейся что-бы все работало, а потом уже добавь потоки.
Что либо телепатически предполагать совсем не хочется.  Улыбающийся
Записан
vunder
Гость
« Ответ #23 : Февраль 23, 2011, 21:52 »

Код:

TerminalThread::TerminalThread (TerminalObject& terminal) :
        QThread (),
        _terminalObject (terminal)
{
    qDebug () << "New thread" << thread()->currentThreadId();
    moveToThread (this);
    qDebug () << "New thread2" << thread()->currentThreadId();
}



Запись New thread и New thread2 выводят у всех потоков одну и ту же цифру.Значит ли это что сам объект класса TerminalThread не принадлежит созданному потоку?Если да, то что я должен для этого сделать?
Они и будут одинаковыми. Конструктор то вызывается в контексте главного потока. Вызов moveToThread() говорит о том, что объект будет работать в другом потоке, но не значит, что он сиюминутно туда перемещен. Выполняемый метод, т.е. конструктор в данном случае, все равно закончит выполнение в контексте процесса, в котором он был вызван
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.226 секунд. Запросов: 20.