
Linux初心者です。
2.6-18-at9 Debianで及ばずながらマルチスレッドのプログラムを書いています。
VBにはOSにコントロールを戻すDoEventsという機能があります。
Windows/VC++ではこれと同等機能の関数を使っています:
DWORD DoEvents(VOID)
{
MSG msg;
while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ){
if ( msg.message == WM_QUIT ){
return( msg.message );
}
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return( 0 );
}
どなたかの示唆によるもので内容はよく理解していませんが、Windows下ではこれで長年つかえてきました。
Linux-gccで同等の関数は定義できるのでしょうか?。
No.1ベストアンサー
- 回答日時:
nora1962様
回答ありがとうございます。
PCからのデータ(data)を受信専用スレッドで受信、メインスレッドで
data = 0;
while (!data) sleep(1);
printf(data %x\n, data);
によりPCからのデータを取得できました。
sleep(1);は特に準備不要で使えました。
VC++におけるSleepでは同じことはできず、先に挙げたDoEvents()を使わざるを得なかったと記憶しています。
ありがとうございました。

No.2
- 回答日時:
WindowsのDoEventsは、GUIプログラムにおいて、メッセージ ループを持つメイン スレッド(UIスレッド)上で実行するべき処理であって、サブ スレッド(ワーカー スレッド)から呼び出してよいものではありません。
DoEventsは主にシングル スレッドのGUIプログラムにおいて、長時間かかる処理を実行している最中に、ユーザーによる中断指示の検出をする場合などに使われます。
マルチ スレッド プログラムにおいては、そもそもメイン スレッドでは長時間かかる処理を行なわないのが原則です。サブ スレッドとの通信や同期は、メッセージ キューやイベントなどの同期オブジェクト、スレッド間共有メモリなどを介して行ないます。
DebianのネイティブAPIは分かりませんが、Qtの場合、QCoreApplication::processEvents()がDoEventsに相当します。
http://qt.nokia.com/downloads-jp/
下記はQtのサンプル コードです。
// 宣言ファイル。
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui
{
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
bool isStopped;
private slots:
void on_btnStop_clicked();
void on_btnStart_clicked();
};
#endif // WIDGET_H
// 実装ファイル。
#include "widget.h"
#include "ui_widget.h"
#include <qthread.h>
class ThreadSleeper : public QThread
{
public:
static void sleep(unsigned long secs)
{
QThread::currentThread()->sleep(secs);
}
static void msleep(unsigned long msecs)
{
QThread::currentThread()->msleep(msecs);
}
static void usleep(unsigned long usecs)
{
QThread::currentThread()->usleep(usecs);
}
};
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget),
isStopped()
{
ui->setupUi(this);
ui->progressBar->setValue(0);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btnStart_clicked()
{
ui->btnStart->setEnabled(false);
this->isStopped = false;
ui->progressBar->setValue(0);
do
{
for (int i = 0; i < 10; ++i)
{
ThreadSleeper::msleep(100);
qApp->processEvents();
}
ui->progressBar->setValue(ui->progressBar->value() + 10);
} while (ui->progressBar->value() < ui->progressBar->maximum() && !this->isStopped);
ui->btnStart->setEnabled(true);
}
void Widget::on_btnStop_clicked()
{
this->isStopped = true;
}
svgh様
回答ありがとうございます。
DoEventsの内容を理解せず、やみくもに使っていました。
当面の課題はsleep(1)で済み、これで先に進むことにしましたが、提示していただいたコードを解釈、DebianのAPIを調べてトレースしてみます。
勉強になりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
マルチスレッドの実行順序の制御
-
スレッドの安全な終了のさせ方
-
CWnd::OnTimerのスレッドの取得
-
マルチスレッドプログラミング...
-
スレッドの終了はどうやるんで...
-
excelvbaでCreateThreadの動作
-
スレッドの終了の仕方
-
Windows上で、シグナル(SIGTERM...
-
WaitForMultipleObjectのイベン...
-
WaitForSingleObjectの使い方に...
-
Macターミナルで実行中のプログ...
-
VBSの処理中一旦処理を止めて再...
-
vb.netでEXCEL起動がうまくでき...
-
VBA kernel32 の意味
-
VBA、UserFormを前面に出力して...
-
TCP/IP通信時のサーバーからの受信
-
タスクマネージャーのプロセス...
-
VBAの配列サイズとメモリに関して
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スレッドの監視方法について
-
VC++スレッドの正しい終了のさ...
-
複数スレッドを動作させるのに...
-
スレッドの安全な終了のさせ方
-
WaitForSingleObjectの使い方に...
-
スレッドにて同一メモリの書き...
-
Windows上で、シグナル(SIGTERM...
-
同一スレッドで、ロックをかけ...
-
マルチスレッド内のループについて
-
sleep関数とは?
-
スレッドの終了はどうやるんで...
-
メインスレッドのPostMessageと...
-
CWnd::OnTimerのスレッドの取得
-
C言語である関数への同時アクセ...
-
別スレッドのデータを受信できない
-
VB2005 シリアル通信のClose処理
-
pthreadの使い方
-
ユーザーインターフェイスの一...
-
Linuxでスレッド優先度って変え...
-
win32 スレッドのハンドルついて
おすすめ情報