Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема со вторым потоком, Секундомер обр. отсче 
V
    Опции темы
SpAwN3D
Дата 13.2.2012, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 23.8.2008

Репутация: нет
Всего: нет



По сути должно отсчитывать секунды при нажатии на кнопку,но когда во втором doWork() потоке создаю бесконечный цикл со Sleep"ом внутри программа вылетает.Если ли другие варианты вместо Sleep или же по другому создать второй тред ?
Код

#include "countdown.h"
#include "ui_countdown.h"
#include <windows.h>
#include <iostream>
#include <process.h>
#include <QThread>
countDown::countDown(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::countDown)
{
    ui->setupUi(this);
    countMS = c = 1000;
    ui->label->setText(QString::number(countMS));
    work = false;
    connect(ui->bStart,SIGNAL(clicked()),this,SLOT(start()));
    connect(ui->bPause,SIGNAL(clicked()),this,SLOT(pause()));
}

void countDown::start()
{
    work = true;
}
void countDown::pause()
{
    work = false;
}
void countDown::stampa()
{
    ui->label->setText(QString::number(countMS));
}

countDown::~countDown()
{
    delete ui;
}

void countDown::doSetup(QThread &cThread)
{
    connect(&cThread,SIGNAL(started()),this,SLOT(doWork()));
}

void countDown::doWork()
{
    while(1)
    {
        if(work)
        {
            Sleep(1000);
            countMS--;
        }
        ui->label->setText(QString::number(countMS));
    }
}



main

Код

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    countDown w;
    w.show();
    QThread cThread;
    w.doSetup(cThread);
    w.moveToThread(&cThread);
    cThread.start();

    return a.exec();
}

PM ICQ   Вверх
Sality123
Дата 13.2.2012, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.3.2011

Репутация: нет
Всего: нет



Мне секундомеры больше нравятся через таймеры. Они кстати сами работают в отдельном потоке.


PM MAIL   Вверх
SpAwN3D
Дата 13.2.2012, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 23.8.2008

Репутация: нет
Всего: нет



QTimer не вариант, т.к. проблема состоит в том что бы самому сделать скажем что-то на него похожее
PM ICQ   Вверх
borisbn
Дата 13.2.2012, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(SpAwN3D @  13.2.2012,  13:19 Найти цитируемый пост)
w.moveToThread(&cThread);

GUI-классы ни в коем случае не должны работать в отдельном потоке.
Сделай наследника от QThread, в его ф-ции run() крути цикл, в котором emit'ай пустой сигнал. Законнекть этот сигнал на слот формы doWork, внутри которого просто делай Sleep и высветку.



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SpAwN3D
Дата 13.2.2012, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 23.8.2008

Репутация: нет
Всего: нет



Добавил такой класс
Код

class Thread : public QThread
{
    Q_OBJECT

signals:
    void aSignal();

protected:
    void run() {
        emit aSignal();
    }
};


и в мейн добавил такое:
Код

    Thread thread;
    QObject::connect(&thread, SIGNAL(aSignal()), &w, SLOT(doWork()));
    thread.start();


Результат тот же что и раньше, при запуске программа вылетает.
Или я не так понял?
PM ICQ   Вверх
borisbn
Дата 13.2.2012, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



w.moveToThread(&cThread); это убрал ?
вообще, покажи весь код (все cpp и h). его там не должно быть много...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SpAwN3D
Дата 13.2.2012, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 23.8.2008

Репутация: нет
Всего: нет



Цитата(borisbn @  13.2.2012,  14:43 Найти цитируемый пост)
w.moveToThread(&cThread); это убрал ?
вообще, покажи весь код (все cpp и h). его там не должно быть много... 


да,убрал

countDown.h
Код

#ifndef COUNTDOWN_H
#define COUNTDOWN_H

#include <QMainWindow>
#include <QThread>
namespace Ui {
class countDown;
}

class countDown : public QMainWindow
{
    Q_OBJECT

public:
    int countMS; // contatore per LED
    int c; // var per ins.
    bool work;
    explicit countDown(QWidget *parent = 0);
    ~countDown();
    //void count(void *p);
    void doSetup(QThread &cThread);
public slots:
    void start();
    void doWork();
    void pause();
    void stampa();

    
private:
    Ui::countDown *ui;
};

class Thread : public QThread
{
    Q_OBJECT

signals:
    void aSignal();

protected:
    void run() {
        emit aSignal();
    }
};

#endif // COUNTDOWN_H


countDown.cpp
Код

#include "countdown.h"
#include "ui_countdown.h"
#include <windows.h>
#include <iostream>
#include <process.h>
#include <QThread>
countDown::countDown(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::countDown)
{
    ui->setupUi(this);
    countMS = c = 1000;
    ui->label->setText(QString::number(countMS));
    work = false;
    connect(ui->bStart,SIGNAL(clicked()),this,SLOT(start()));
    connect(ui->bPause,SIGNAL(clicked()),this,SLOT(pause()));
}

void countDown::start()
{
    work = true;
}
void countDown::pause()
{
    work = false;
}
void countDown::stampa()
{
    ui->label->setText(QString::number(countMS));
}

countDown::~countDown()
{
    delete ui;
}

void countDown::doSetup(QThread &cThread)
{
    connect(&cThread,SIGNAL(started()),this,SLOT(doWork()));
}

void countDown::doWork()
{
    do
    {
        if(work)
        {
            Sleep(1000);
            countMS--;
        }
        ui->label->setText(QString::number(countMS));
    }while(countMS != 0);

}


main.cpp
Код

#include <QtGui/QApplication>
#include "countdown.h"
#include <QThread>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    countDown w;
    w.show();
    Thread thread;
    QObject::connect(&thread, SIGNAL(aSignal()), &w, SLOT(doWork()));
    thread.start();
    return a.exec();
}


вообще-то ничего такого
PM ICQ   Вверх
borisbn
Дата 13.2.2012, 15:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Код


class Thread : public QThread
{
    Q_OBJECT

public:
    Thread() : m_abort( false ) {}
    bool m_abort;
signals:
    void aSignal();

protected:
    void run() {
        do
        {
            msleep(1000);
            emit aSignal();
        }
        while ( !m_abort );
    }
};

...

void countDown::doWork()
{
    if ( work )
    {
        countMS--;
    }
    ui.label->setText(QString::number(countMS));
}

...

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    countDown w;
    w.show();
    Thread thread;
    QObject::connect(&thread, SIGNAL(aSignal()), &w, SLOT(doWork()));
    thread.start();

    int res = a.exec();
    thread.m_abort = true;
    return res;
}


такой код у меня работает, не вылетает, не виснет.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SpAwN3D
Дата 13.2.2012, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 23.8.2008

Репутация: нет
Всего: нет



Цитата(borisbn @  13.2.2012,  15:13 Найти цитируемый пост)
такой код у меня работает, не вылетает, не виснет. 

Спасибо! Работает, но вот появилась другая проблема, появилась задержка, но думаю это решается.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.