crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Приостановка потока
igor_bogomolov
  опции профиля:
сообщение 5.6.2009, 11:01
Сообщение #11


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(AD @ 5.6.2009, 11:29) *
Вот то что не пытался разобраться - это плохо! Я даже прокомментировал все действия. что выполняются в этих функциях!
Да какая мне разница куда у тебя там прожектор крутится, или что такое VALFROMBYTES. Я смотрю на структуру программы, и на поставленный тобою вопрос. Решение поставленной тобой задачи, на мой взглад не правильное. В каком направлении двигаться, тебе сказали. А делать такие заявления, как минимум не уважение. Разбирайся тогда сам, мне мое время тоже дорого.

Цитата(AD @ 5.6.2009, 11:29) *
А убрать - не уберу, потому что это условие не выполняется, когда туда заходим после паузы, а при первом заходе, как правило, оно срабатывает.
Да черт с ним с условием. quit там зачем поставил. Он вообще не нужен если нет цикла обработки событий. Ты хоть в асистент загляни.
Цитата
Tells the thread's event loop to exit with return code 0 (success). Equivalent to calling QThread::exit(0).

This function does nothing if the thread does not have an event loop.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 5.6.2009, 11:29
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Хорошо, quit() убрал.


Цитата(igor_bogomolov @ 5.6.2009, 12:01) *
А делать такие заявления, как минимум не уважение. Разбирайся тогда сам, мне мое время тоже дорого.

Прости, вот обижать я не хотел.
Просто некоторые вещи для анализа кода в целом можно и опустить, на мой взгляд. Если что, не сердись - неспециально! Прости!

Указанная функция из двух байт (параметры) собирает одно числа типа int!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 5.6.2009, 13:00
Сообщение #13


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Вот простенький пример, как приостановить поток при помощи QMutex & QWaitCondition.

mythread.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QThread>
#include <QMutex>
#include <QWaitCondition>

class myThread : public QThread
{
    Q_OBJECT

    bool pause;
    QMutex mutex;
    QWaitCondition cond;

public:
    myThread(QObject *parent = 0);
    ~myThread();

protected:
    void run();

private slots:
    void togglePaused();
};

#endif // DIALOG_H
mythread.cpp
#include "mythread.h"
#include <QtDebug>

myThread::myThread(QObject *parent)
    : QThread(parent), pause(false)
{

}

myThread::~myThread()
{
}

void myThread::togglePaused()
{
    if (pause) {
        cond.wakeOne();
        pause = false;
    } else {
        pause = true;
    }
}

void myThread::run()
{
    const int Timeout = 3 * 100;
    int count = 0;

    forever {
        while(pause) {
            mutex.lock();
            cond.wait(&mutex);
            mutex.unlock();
        }

        qDebug() << count++;
        msleep(Timeout);
    }
}

main.cpp
#include <QtGui>
#include "mythread.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QDialog dlg;
    QPushButton *pb = new QPushButton("Pause", &dlg);
    QHBoxLayout *hbl = new QHBoxLayout(&dlg);
    hbl->addWidget(pb);
    dlg.setLayout(hbl);

    myThread *thread = new myThread(&dlg);
    QObject::connect(pb, SIGNAL(clicked()), thread, SLOT(togglePaused()));
    thread->start();

    dlg.show();
    return a.exec();
}
.pro
TARGET = pauseThread
TEMPLATE = app
CONFIG += console
SOURCES += main.cpp\
        mythread.cpp
HEADERS  += mythread.h

Прикрепленные файлы
Прикрепленный файл  pauseThread.zip ( 1,53 килобайт ) Кол-во скачиваний: 136
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 8.6.2009, 13:12
Сообщение #14


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


#include <sys/timeb.h>
#include <time.h>

....

void CMyThreadClass::MySleep(unsigned int uiPause_ms)
{
  int long long delta_ms = 0;
  struct timeb    timeb_prev;
  struct timeb    timeb_cur;
  ftime(&timeb_prev);
  do
  {
    ftime(&timeb_cur);
    delta_ms = 1000 * (timeb_cur.time - timeb_prev.time) + (timeb_cur.millitm - timeb_prev.millitm);
  }
  while(delta_ms < uiPause_ms);
};


просто, но зато ресуры проца буду юзаться...

Сообщение отредактировал flankerr - 8.6.2009, 13:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.6.2009, 13:25
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(flankerr @ 8.6.2009, 14:12) *
просто но зато ресуры проца буду юзаться...

А зачем загружать процессор глупыми вычислениями времени? Если уж нити нужна пауза, лучше что-бы она в это время вообще ресурсы процессора не ела и он занялся чем-то более нужным. ;)

Сообщение отредактировал BRE - 8.6.2009, 13:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 8.6.2009, 14:14
Сообщение #16


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 9.1.2008
Пользователь №: 65

Спасибо сказали: 2 раз(а)




Репутация:   0  


иногда,в тех случаях когда пауза небольшая и загрузка потка не особа критична, проще и выгодней написать три строчки кода чем городить целый огород.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.6.2009, 15:02
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(flankerr @ 8.6.2009, 15:14) *
иногда,в тех случаях когда пауза небольшая и загрузка потка не особа критична, проще и выгодней написать три строчки кода чем городить целый огород.

IMHO, не очень хорошее отношение к коду. Да, для тебя, как для разработчика, так сделать проще . А вот если в каждой программе запущенной на компе, разработчики сделают по одному-паре таких потоков, и эти программы будут крутиться одновременно, то производительность может упасть очень сильно. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 8.6.2009, 18:19
Сообщение #18


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


тему разделил, см. sleep в main'е
Всё таки от приостановки отдельного потока сильно отличается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 3.1.2025, 7:26