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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: ctrl+shift - вешает программу  (Прочитано 20839 раз)
CuteBunny
Гость
« : Август 01, 2012, 11:10 »

Есть следующий код:

Код потока:
Код
C++ (Qt)
#ifndef AUTOTHREADOBJ_H
#define AUTOTHREADOBJ_H
 
#include <QObject>
 
class QWaitCondition;
class QMutex;
 
class AutoThreadObj : public QObject
{
Q_OBJECT
 
public:
AutoThreadObj(QObject *parent = 0);
~AutoThreadObj();
void resume();
void stop();
 
public slots:
void process();
 
private:
QWaitCondition *m_condition;
QMutex *m_mutex;
volatile bool m_stop;
 
signals:
void finished();
};
#endif // AUTOTHREADOBJ_H
 
#include "AutoThreadObj.h"
 
#include <QWaitCondition>
#include <QMutex>
 
#include <QDebug>
 
AutoThreadObj::AutoThreadObj(QObject *parent)
: QObject(parent)
, m_condition(new QWaitCondition)
, m_mutex(new QMutex)
, m_stop(false)
{
 
}
 
AutoThreadObj::~AutoThreadObj()
{
 
}
 
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();
}
 
void AutoThreadObj::resume()
{
m_mutex->lock();
m_condition->wakeOne();
m_mutex->unlock();
}
 
void AutoThreadObj::stop()
{
m_mutex->lock();
m_stop = true;
m_condition->wakeOne();
m_mutex->unlock();
}
 

Код главного окна:

Код
C++ (Qt)
#ifndef QTMPWND_H
#define QTMPWND_H
 
#include <QtGui/QMainWindow>
#include "ui_qtmpwnd.h"
 
class QThread;
class AutoThreadObj;
class QCloseEvent;
 
class QTmpWnd : public QMainWindow
{
Q_OBJECT
 
public:
QTmpWnd(QWidget *parent = 0, Qt::WFlags flags = 0);
~QTmpWnd();
 
private:
Ui::QTmpWndClass ui;
 
QThread *m_autoThread;
AutoThreadObj *m_autoObj;
 
protected:
void closeEvent(QCloseEvent *e);
};
 
#endif // QTMPWND_H
 
#include "qtmpwnd.h"
 
#include <QThread>
#include <QCloseEvent>
#include "autothreadobj.h"
 
QTmpWnd::QTmpWnd(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
m_autoThread = new QThread;
m_autoObj = new AutoThreadObj;
m_autoObj->moveToThread(m_autoThread);
connect(m_autoThread, SIGNAL(started()), m_autoObj, SLOT(process()), Qt::QueuedConnection);
connect(m_autoObj, SIGNAL(finished()), m_autoThread, SLOT(quit()), Qt::QueuedConnection);
m_autoThread->start();
}
 
QTmpWnd::~QTmpWnd()
{
 
}
 
void QTmpWnd::closeEvent(QCloseEvent *e)
{
if (m_autoThread->isRunning()) {
m_autoObj->stop();
m_autoThread->quit();
m_autoThread->wait();
}
delete m_autoObj;
delete m_autoThread;
e->accept();
}
 

Если нажать ctrl+shift на главном окне, оно виснет...
Если не запускать поток, то все работает...

Что я сделал нетак?

qt.4.8.1, msvs2010, windows xp
Записан
Bepec
Гость
« Ответ #1 : Август 01, 2012, 11:59 »

Проблема не в твоей программе, % 98.

Если в твоих классах нигде клавиши не перехватываются, то проблема в винде.

Выкинь проект в архиве тестовый.

PS помнится был глюк с ctrl+shift  в XP. Вместо переключения языка, оно делало окно программы занятым(неактивным вроде как, неотвечающим). В общем выкидывай проект, скорее всего у тебя что-то в системе Улыбающийся
Записан
CuteBunny
Гость
« Ответ #2 : Август 01, 2012, 12:07 »

Проект...
Записан
Bepec
Гость
« Ответ #3 : Август 01, 2012, 12:18 »

Всё работает, исправно и вроде даже без утечек. Ничего странного.
Записан
CuteBunny
Гость
« Ответ #4 : Август 01, 2012, 12:20 »

Всё работает, исправно и вроде даже без утечек. Ничего странного.

Какая версия qt и платформа у Вас?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Проверил на 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 и рухнет если его вызвать дважды. Многовато  Улыбающийся
Записан
Bepec
Гость
« Ответ #6 : Август 02, 2012, 06:52 »

Пробовал на W7 sp1 x64 и WXP sp3 x86. Улыбающийся
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



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

Подобный глюк до сих пор есть у Qt Creator. Поищи, тут на форуме обсуждался. "Срабатывал" только если на Ctrl+Shift завязано переключение раскладки. Не знаю, общая ли у этих глюков причина, но поведение очень похоже.
Проверил Win 7 x64, Qt 4.8.1, MinGW - подтверждаю наличие глюка. Зависает при переключении раскладки - у меня не Ctrl+Shift. Причем, если QtCreator "раздуплялся" через некоторое время (~20 сек), то тут полный зависон. Можно добавить информацию на баг-трекер.
« Последнее редактирование: Август 02, 2012, 09:28 от xokc » Записан
Bepec
Гость
« Ответ #8 : Август 02, 2012, 09:22 »

Да, кстати, IDE - Visual Studio 2008 Улыбающийся
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



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

Нашел старые темы на эту тему Улыбающийся.
http://www.prog.org.ru/topic_15586_0.html
http://www.prog.org.ru/topic_12359_0.html
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



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

Интересно, что поток в зависшем приложении продолжает исправно выполняться. То есть виснет где-то в недрах Qt.
Записан
Bepec
Гость
« Ответ #11 : Август 02, 2012, 10:17 »

Мб просто QtCreator зацикливает очередь событий гуи потока? Тем самым объясняется, почему второй поток работает безболезненно - у него другая очередь событий.
И это зависит не от системы 100% - тогда бы висли все потоки, по идее Улыбающийся

У вас там в нём нет никаких хитрых настроек? типа переключать язык по ctrl+shift, независимо от системы и прочая?

PS Конечно хорошо было бы логгировать воздействия креатора на проект Улыбающийся интересненько.
Записан
CuteBunny
Гость
« Ответ #12 : Август 02, 2012, 10:44 »

Попробовал сменить сочетание клави для смены языка с ctrl+shift на alt+shift, теперь у меня виснет при alt+shift, при ctrl+shift не виснет...

Блин попробую поставить qt4.8.2 может глюк какой-нибудь в 4.8.1 под windows xp...
Записан
CuteBunny
Гость
« Ответ #13 : Август 02, 2012, 10:48 »

Проверил на 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 и рухнет если его вызвать дважды. Многовато  Улыбающийся

Буду признателен, если покажите/расскажите, как улучшить данный код...Улыбающийся
Записан
CuteBunny
Гость
« Ответ #14 : Август 02, 2012, 10:49 »

p.s.: еще забыл сказать, что qt.4.8.1 у меня была собрана из исходников, не sdk и не бинарник... может собрал/собралось криво...
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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