关于 Qt sleep

26 views
Skip to first unread message

张荣锋

unread,
Dec 13, 2009, 10:49:12 PM12/13/09
to Qt 中文论坛
由于跨平台需求,不能使用Win API 的sleep,而Qt sleep方法又是protect的,
有没有一种比较方便的方式调用sleep,我现在的做法是:

#include <QThread>

class MyThread : public QThread {

public:

virtual void run();

};

void MyThread::run() {

msleep(1000);

}

然后在main中调用:

int main {

MyThread t;
t.start();
t.wait();
return 0;
}

有点麻烦,而且没有办法指定延时(毫)秒数。望指教~~




--
Thanks and Best regards!

from ZhangRongfeng
来自 张荣锋
Skype:  zhangrongfeng003
Phone: 0755 26021 397
Mobile: +86 151 1249 8020
E-mail: zhangron...@gmail.com
Addr: 深圳市南山区南海大道19号百盈医疗器械园二楼B座
Samuel Goldwyn  - "I'm willing to admit that I may not always be right, but I am never wrong."

GunsNRose

unread,
Dec 13, 2009, 10:55:00 PM12/13/09
to qt-c...@googlegroups.com
�� 2009-12-14 11:49, ���ٷ� д��:
���ڿ�ƽ̨���󣬲���ʹ��Win API ��sleep����Qt sleep��������protect�ģ�
��û��һ�ֱȽϷ���ķ�ʽ����sleep�������ڵ�����:

#include <QThread>

class MyThread : public QThread {
public:

virtual void run();

};

void MyThread::run() {

msleep(1000);

}

Ȼ����main�е��ã�

int main {

MyThread t;
t.start();
t.wait();
return 0;
}

�е��鷳������û�а취ָ����ʱ(��)������ָ�̡���




--
Thanks and Best regards!

from ZhangRongfeng
4�� ���ٷ�

Skype:  zhangrongfeng003
Phone: 0755 26021 397
Mobile: +86 151 1249 8020
E-mail: zhangron...@gmail.com
Addr: ��������ɽ���Ϻ����19�Ű�ӯҽ����е԰��¥B��
Samuel Goldwyn  - "I'm willing to admit that I may not always be right, but I am never wrong."


�Ƿ���Կ�����һ������Բ�ͬƽ̨������Ӧ��API4ʵ���أ����߳�4ʵ�֣��е���С�ã�Ҳ�鷳��
void Mymsleep(quint32 ms)
{
    #if WINƽ̨
     WIN_API_msleep(ms);
    #else posixƽ̨
     msleep(ms);
    #endif
}
��֪�������Ƿ����һ���

张荣锋

unread,
Dec 14, 2009, 12:56:32 AM12/14/09
to qt-china
msleep(ms); 这个不能直接调用。



2009/12/14 GunsNRose <zlb...@gmail.com>
于 2009-12-14 11:49, 张荣锋 写道:
由于跨平台需求,不能使用Win API 的sleep,而Qt sleep方法又是protect的,
有没有一种比较方便的方式调用sleep,我现在的做法是:

#include <QThread>

class MyThread : public QThread {
public:

virtual void run();

};

void MyThread::run() {

msleep(1000);

}

然后在main中调用:

int main {

MyThread t;
t.start();
t.wait();
return 0;
}

有点麻烦,而且没有办法指定延时(毫)秒数。望指教~~




--
Thanks and Best regards!

from ZhangRongfeng
来自 张荣锋

Skype:  zhangrongfeng003
Phone: 0755 26021 397
Mobile: +86 151 1249 8020
E-mail: zhangron...@gmail.com
Addr: 深圳市南山区南海大道19号百盈医疗器械园二楼B座
Samuel Goldwyn  - "I'm willing to admit that I may not always be right, but I am never wrong."


是否可以考虑做一个函数,针对不同平台调用相应的API来实现呢,拿线程来实现,有点大材小用,也麻烦,
void Mymsleep(quint32 ms)
{
    #if WIN平台
     WIN_API_msleep(ms);
    #else posix平台
     msleep(ms);
    #endif
}
不知道这样是否会更好一点点

--

您收到此邮件是因为您订阅了 Google 网上论坛的“Qt中文”论坛。
要向此网上论坛发帖,请发送电子邮件至 qt-c...@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 qt-china+u...@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/qt-china?hl=zh-CN 访问此网上论坛。



--
Thanks and Best regards!

from ZhangRongfeng
来自 张荣锋

Skype:  zhangrongfeng003
Phone: 0755 26021 397
Mobile: +86 151 1249 8020
E-mail: zhangron...@gmail.com
Addr: 深圳市南山区南海大道19号百盈医疗器械园二楼B座
Pablo Picasso  - "Computers are useless. They can only give you answers."

Kermit Mei

unread,
Dec 14, 2009, 1:33:55 AM12/14/09
to qt-c...@googlegroups.com
On Mon, 2009-12-14 at 13:56 +0800, 张荣锋 wrote:
> msleep(ms); 这个不能直接调用。

要是我没有记错,那个是个静态protected成员,可以用QThread::msleep(ms)来调
用的吧?


张荣锋

unread,
Dec 14, 2009, 10:32:05 AM12/14/09
to qt-china
不能“直接”调用,比如:
class sleeper : public QThread {

public:

static void sleep( unsigned long secs) {QThread::sleep( secs);}

static void msleep( unsigned long msecs) {QThread::msleep( secs);}

static void usleep( unsigned long usecs){QThread::usleep( secs);}

};

在main()中用的时候,成了: sleeper.msleep(1000);

而不是 msleep();


我在网上找了一下,有个牛人这么写的:

void msleep( unsigned long msecs) {

QWaitCondition w;

QMutex sleepmutex;

sleepmutex.lock();

w.wait( &sleepmutex, msecs);

sleepmutex.unlock();

}

验证可用。



2009/12/14 Kermit Mei <kermi...@gmail.com>
--

您收到此邮件是因为您订阅了 Google 网上论坛的“Qt中文”论坛。
要向此网上论坛发帖,请发送电子邮件至 qt-c...@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 qt-china+u...@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/qt-china?hl=zh-CN 访问此网上论坛。





--
Thanks and Best regards!

from ZhangRongfeng
来自 张荣锋
Skype:  zhangrongfeng003
Phone: 0755 26021 397
Mobile: +86 151 1249 8020
E-mail: zhangron...@gmail.com
Addr: 深圳市南山区南海大道19号百盈医疗器械园二楼B座

Kermit Mei

unread,
Dec 14, 2009, 9:05:18 PM12/14/09
to qt-c...@googlegroups.com
On Mon, 2009-12-14 at 23:32 +0800, 张荣锋 wrote:
> 不能“直接”调用,比如:

可以这么调用吧:
$ ls
main.cpp Thread.cpp Thread.h
$ cat *
/*** main.cpp ***/
#include <QApplication>
#include "Thread.h"

int main(int argc,char *argv[])
{
QApplication app(argc,argv);
Thread mythread;
mythread.start();
return app.exec();
}
/*** End of main.cpp ***/
/***** Thread.cpp *****/
#include "Thread.h"


Thread::Thread(QObject *parent)
: QThread(parent)
{
qDebug("Thread::Thread(QObject *parent)");
}

Thread::~Thread()
{
qDebug("Thread::~Thread()");
}

void Thread::run() {
qDebug("Calling QThread::msleep(10,000)");
QThread::msleep(10000);
qDebug("wake up!");
}
/***** End of Thread.cpp *****/

/***** Thread.h *****/
#include <QThread>

class Thread : public QThread
{
Q_OBJECT
public:
Thread(QObject *parent = 0);
~Thread();

protected:
virtual void run();
};
/***** End of Thread.h *****/


其实我觉得你没有理解QThread封装的意义,新线程所有的执行控制都是必须
放到run中的, 只有在run()中的执行代码才是新线程的,其他代码都是QThread的
——QThread本身并不代表一个线程,它只不过是一个管理线程属性的抽象体。

如果你一定需要通过调用对象来让它睡,那应该是一种类似同步的情况,
QWaitCondition和QMutex是最合适的,呵呵。

Hope helps.

B.R
Kermit


张荣锋

unread,
Dec 14, 2009, 9:13:28 PM12/14/09
to qt-china
我是第二种情况,只是想调用thread做个delay而已,而且尽量的像WinAPI sleep那样简单。 



2009/12/15 Kermit Mei <kermi...@gmail.com>
--

您收到此邮件是因为您订阅了 Google 网上论坛的“Qt中文”论坛。
要向此网上论坛发帖,请发送电子邮件至 qt-c...@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 qt-china+u...@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/qt-china?hl=zh-CN 访问此网上论坛。





--
Thanks and Best regards!

from ZhangRongfeng
来自 张荣锋
Skype:  zhangrongfeng003
Phone: 0755 26021 397
Mobile: +86 151 1249 8020
E-mail: zhangron...@gmail.com
Addr: 深圳市南山区南海大道19号百盈医疗器械园二楼B座
Charles de Gaulle  - "The better I get to know men, the more I find myself loving dogs."
32B.gif
Reply all
Reply to author
Forward
0 new messages