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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: ctrl+shift - вешает программу  (Прочитано 21037 раз)
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #15 : Август 02, 2012, 11:11 »

А зависания бывают только под средой или в отдельно запускаемом exe-шнике тоже?
Записан
CuteBunny
Гость
« Ответ #16 : Август 02, 2012, 11:48 »

А зависания бывают только под средой или в отдельно запускаемом exe-шнике тоже?

У меня в отдельном экзе тоже виснет, я запускаю debug-версию через консоль с qt-vars
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #17 : Август 02, 2012, 12:24 »

4.8.2 не поможет. Эта хрень тянется еще 2009 года и у меня проявляется на всех Windows, всех компиляторах и всех версиях Qt. Приложенный автором темы проект виснет где-то в глубине ntdll.LdrFindResource и в debug и в release сборках, запущенный как из-под Creator, так и как отдельное приложение. При этом, повторюсь, сам код из void AutoThreadObj::process() продолжает прекрасно выполняться и в зависшем приложении.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Август 02, 2012, 12:38 »

Проверил на OSX, зависания не наблюдаю.
Код потока:
Код
C++ (Qt)
void AutoThreadObj::process()
{
forever {
m_mutex->lock();
m_condition->wait(m_mutex); //wait for resume
if (m_stop) {
m_mutex->unlock();
break;
}
//do something
m_mutex->unlock();
}
 
delete m_condition;
delete m_mutex;
emit finished();
}
 
Формальных ошибок нет, но этот метод будет тормозить, может "не разбудиться" по resume и рухнет если его вызвать дважды. Многовато  Улыбающийся

Буду признателен, если покажите/расскажите, как улучшить данный код...Улыбающийся
1) Если создаете m_condition; и m_mutex в конструкторе, то и удаляйте в деструкторе. А так просто остаетесь с невалидным объектом после вызова process, а если он не будет вызван - утечка

2) все тело dо_something защищено мутексом. Значит др нитка желающая сделать resume будет ждать на мутексе пока все не закончится. Правильно делать под мутексом лишь минимальные действия (напр извлечь элемент из контейнера), освободить мутекс как можно быстрее, а там уже заниматься с данными

3) waitCondition - та же ошибка что и в букваре.
Код
C++ (Qt)
void AutoThreadObj::process()
{
forever {
m_mutex->lock();
               m_condition->wait(m_mutex); //wait for resume
 
Нитка пытается захватить лок, но в это время др нитка (может главная) ее опередила делая resume. Что происходит дальше. Захватив лок, главная нитка делает wakeOne - но на m_condition никто еще не ждет,  wakeOne возвращает управление ничего не сделав и освобождает мутекс. Теперь AutoThreadObj получает лок и ждет, но поезд-то уже ушел. Возможно поэтому Вы поставили в исходниках wait на полсекунды  Улыбающийся

Я бы посоветовал в данном случае использовать QSemapohre вместо waitCondition
Записан
Bepec
Гость
« Ответ #19 : Август 02, 2012, 12:46 »

Конечно мб это жуткий глюк у вас, но если б приложение ёкалось в ntdll, то вырубало бы полностью.

Попробуйте собрать под Visual studio.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #20 : Август 02, 2012, 13:10 »

Конечно мб это жуткий глюк у вас, но если б приложение ёкалось в ntdll, то вырубало бы полностью.

Попробуйте собрать под Visual studio.
Bepec, когда же уже читать научимся? Повторюсь:
1. Оно не падает, оно виснет. И виснет внутри ntdll.
2. У меня проявляется на всех Windows, всех компиляторах и всех версиях Qt.

Всех компиляторах - значит Visual Studio 2008 тоже проверялся. Там виснет в ntdll.RtlUniform.
Записан
Bepec
Гость
« Ответ #21 : Август 02, 2012, 13:37 »

У меня не виснет, не чешется, не грузит, не балахтается.

ЧЯДНТ?

PS тестовый проект собирал VS2008 с интеграцией. Ну почему у меня всё бачит??
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #22 : Август 02, 2012, 14:05 »

Дак откуда ж мне знать, почему? Знал бы - сюда и не писал ничего - у себя исправил бы и дело с концом.
Записан
Bepec
Гость
« Ответ #23 : Август 02, 2012, 14:20 »

Соберите тогда проект и с дллками залейте. Вдруг загнётся и у меня?
Записан
CuteBunny
Гость
« Ответ #24 : Август 02, 2012, 15:25 »

Проверил на OSX, зависания не наблюдаю.
Код потока:
Код
C++ (Qt)
void AutoThreadObj::process()
{
forever {
m_mutex->lock();
m_condition->wait(m_mutex); //wait for resume
if (m_stop) {
m_mutex->unlock();
break;
}
//do something
m_mutex->unlock();
}
 
delete m_condition;
delete m_mutex;
emit finished();
}
 
Формальных ошибок нет, но этот метод будет тормозить, может "не разбудиться" по resume и рухнет если его вызвать дважды. Многовато  Улыбающийся

Буду признателен, если покажите/расскажите, как улучшить данный код...Улыбающийся
1) Если создаете m_condition; и m_mutex в конструкторе, то и удаляйте в деструкторе. А так просто остаетесь с невалидным объектом после вызова process, а если он не будет вызван - утечка

2) все тело dо_something защищено мутексом. Значит др нитка желающая сделать resume будет ждать на мутексе пока все не закончится. Правильно делать под мутексом лишь минимальные действия (напр извлечь элемент из контейнера), освободить мутекс как можно быстрее, а там уже заниматься с данными

3) waitCondition - та же ошибка что и в букваре.
Код
C++ (Qt)
void AutoThreadObj::process()
{
forever {
m_mutex->lock();
               m_condition->wait(m_mutex); //wait for resume
 
Нитка пытается захватить лок, но в это время др нитка (может главная) ее опередила делая resume. Что происходит дальше. Захватив лок, главная нитка делает wakeOne - но на m_condition никто еще не ждет,  wakeOne возвращает управление ничего не сделав и освобождает мутекс. Теперь AutoThreadObj получает лок и ждет, но поезд-то уже ушел. Возможно поэтому Вы поставили в исходниках wait на полсекунды  Улыбающийся

Я бы посоветовал в данном случае использовать QSemapohre вместо waitCondition

Спасибо, попробую через QSemaphore.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #25 : Август 02, 2012, 16:47 »

Соберите тогда проект и с дллками залейте. Вдруг загнётся и у меня?
Ok. Вот. Qt 4.8.2, MSVS 2010 (2008 на этой машине нет). Виснет.
http://files.mail.ru/WBSEX6
От Вас тогда жду скомпилённое у Вас.
Записан
Bepec
Гость
« Ответ #26 : Август 03, 2012, 07:18 »

https://dl.dropbox.com/u/62712483/Release.zip
Qt 4.7.2 MSVS 2008. Библиотечки ещё сжаты upx Улыбающийся Ну и дизайн чуть улучшил, а то статика напрягала.

PS Ваша версия работает как отбойный молоток - неостанавливаясь.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #27 : Август 03, 2012, 08:23 »

Ответный комплимент - Ваша так же намертво виснет, как и моя. Улыбающийся
Дело всё-таки в ОС. Проверял на двух компах с Win7 х64. Пошел WinXP искать.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #28 : Август 03, 2012, 08:26 »

Проверил на корпоративной WinXP Pro SP3. Висим.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #29 : Август 03, 2012, 08:29 »

Нашёл! Punto Switcher косячит! Убираю его - и всё нормально. Кому бы теперь написать - в Nokia или в Yandex?
P.S. Давно его (Punto) подозревал, но народ писал, что в Qt Creator bug проявлялся независимо от наличия switcher.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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