こんにちわ。
いきなりですが、VC++でユーザーインターフェイススレッドを使って、
ボタンが1つあればいいだけの別スレッドダイアログを作らなくちゃならないの
です。
CWndThreadクラスを使う。。。とかCWndThreadクラスの関数を
オーバーライドしなくちゃならないらしいとか、MSDNのヘルプを見てそこまでは
わかったのですが、実際、何をどう作っていいのか、途方にくれています。
サンプルを入手して、ソースを追っかけてみているのですが、MSDNのサンプルは
余計な機能とかがいっぱい入っていて、「本当に必要なコードはこれ!!」
というのがよくわかりません。
どなたか、すっごーく単純なスレッド作成、スレッド側の最低限コーディング
を教えてください!!というか、助けてください!!!!

A 回答 (1件)

簡単なサンプルです。


--------------------------------------
//スレッドからの呼び出し関数
UINT SendAutoThread(LPVOID pParam){
//ここにスレッドの処理を書く

return 0;
}

//Hogeボタンを押したとき
void CHogeDlg::OnHoge(){
//スレッド作成
CWinThread *pThread = AfxBeginThread(
HogeThread,//呼び出す関数
this);
}
------------------------------------------
    • good
    • 0
この回答へのお礼

ありがとうございました。
私は、AfxBeginThread()ではなく、CreateThread()を使用して
作成していたのですが、AfxBeginThread()に替えたら無事に動きました。

余談ですが、CreateThread()関数で作成したとき、
Windows98でやっていたのですが、どうしてもスレッド側の関数に
処理が行かなくて困っていたのでAfxBeginThread()に替えたらOKでした。
でも、Windows98でだめだったソースをそのままWindows2000で
テストしてみたら問題なく動くんです。。。。結局、プログラムのせいでは
なくて、OSに依存するってことなんでしょうか。。。。
腑に落ちない点がありますが、ターゲットはWindows98だそうなので、動くようになって一件落着しました。
ありがとうございました。

お礼日時:2001/06/08 12:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QスレッドAで信号を送り、返答があったときにスレッドBを起動、スレッドAの信号のデータを初期化する方法

VC6.0で開発しています。
今、次のような処理をどうすればよいか悩んでいます。ヒントになる回答を頂けたら幸いです。

データをやり取りする際、どのような処理を行うか命令するもの(以下、命令A)と、命令された通りのデータを送るもの(以下、送信B)、そして、AとBの通信部分を担うもの(以下、通信C)があります。

データのやりとりは、マルチスレッドで行っています。
データをやりとりするために、スレッドが通信C上で2つ起動しています。1つ目のスレッド(以下、スレッドA)は、送信Bが命令Aから送られる特定のデータ(以下、データA)を受け取れるかをどうかの信号を、命令Aに送るためのものです。2つ目のスレッド(以下、スレッドB)は、データAを通信Cが受け取り、送信Bに渡すときに起動するスレッドです。

スレッドAで、送信Bから命令Aへ、受信の準備ができたことを伝える信号が送られます。その後、命令AよりデータAが送られ、通信CでスレッドBが起動するのですが、データAを通信Cで受信したとき、スレッドAで送っている信号を初期化しなければいけません。

データAを受信したときにはスレッドBが起動しますので、スレッドAとスレッドBの間での処理ということになります。

スレッド処理について、まだまだ不勉強なのですが、よいアイディアがあれば教えてください。
よろしくお願いします。

VC6.0で開発しています。
今、次のような処理をどうすればよいか悩んでいます。ヒントになる回答を頂けたら幸いです。

データをやり取りする際、どのような処理を行うか命令するもの(以下、命令A)と、命令された通りのデータを送るもの(以下、送信B)、そして、AとBの通信部分を担うもの(以下、通信C)があります。

データのやりとりは、マルチスレッドで行っています。
データをやりとりするために、スレッドが通信C上で2つ起動しています。1つ目のスレッド(以下、スレッドA)は、送信Bが...続きを読む

Aベストアンサー

アプリ毎に整理してみました。分からないところは想像で書いています。

--命令A--
(1)「命令A→通信C」のファイルを作成。「送信Bが送信Aに対して、データの要求をしているのかを判別するデータを送信しろ」を送る。
(2)「通信C→送信B、命令A」のファイルを監視。「命令Aにデータ要求」が書き込まれるの待つ。
(3)「命令A→通信C」のファイル2を作成。「送信Bの要求データ」を作成する。
(4)「通信C→送信B、命令A」のファイルを監視。「送信Bはデータの要求をしていない」に書き換わるの待つ。
(5)(1)に戻る。

--送信B--
(1)「通信C→送信B、命令A」のファイルを監視。「送信Bが命令Aに対して、データの要求があるか」が書き込まれるのを待つ。
(2)「送信B→通信C」のファイルを作成して、「送信Bが命令Aに対して、データの要求がある」を書き込む。
(3)「通信C→送信B」のファイルが作成されるのを待つ。
(4)ファイルを読んで、データを何らかの手段で送信。
(5)(1)に戻る。

--通信C--
(1)「命令A→通信C」のファイルが作成されるを待つ。
(2)スレッド1を起動する。
(3)「送信B→通信C」のファイルが作成されるのを待つ。
(4)スレッド1に(3)に進むよう指令を出す。
(5)「送信B→通信C」のファイルを削除する。
(6)「命令A→通信C」のファイル2が作成されたことを検出。
(7)スレッド2を起動する。
(8)このあと???

・スレッド1
(1)「通信C→送信B、命令A」のファイルを作成。「送信Bが命令Aに対して、データの要求があるか」を書き込む。
(2)何らかの指令があるまで(1)を繰り返す。
(3)「通信C→送信B、命令A」のファイルを書き換え。「命令Aにデータ要求」に書き換える。
(4)何らかの指令があるまで(3)を繰り返す。
(5)「通信C→送信B、命令A」のファイルを書き換え。「送信Bはデータの要求をしていない」に書き換える。
(6)「命令A→通信C」のファイルを削除する。
(7)スレッドを終了する。

・スレッド2
(1)スレッド1に対して、指令を送り(5)に移行するように促す。
(2)「命令A→通信C」のファイル2を読み込み、「通信C→送信B」のファイルを作成する。コピー後「命令A→通信C」のファイル2は削除する。
(3)スレッドを終了する。

勘違いがあったら訂正をお願いします。

全体として問題を感じたので何点か上げます。
・ファイル作成を条件に動いている所があるが、ファイル内容が全部書き出されていないうちに動き出してしまわないか?
・必要な動作に対してやっていることが複雑である。処理の起点はなぜ送信Bの要求から始まらないのか?命令Aから始まる理由は?
・ファイルの後始末が不明確。
・スレッド1の処理で、何度もファイルを書き換える理由は?
・命令Aと送信Bが通信していれば作れそうな気がする処理で、通信Cが必要な理由が分からない。


シンプルにするとしたら、こんな感じには出来ないのでしょうか?
一応命令Aを起点にしています。スレッドがなくなってしまうので、このアプリの構成がスレッドの勉強のためだったら申し訳ない!

--命令A--
(1)送信Bにメッセージで要求がないか問い合わせる。
(2)送信Bの返事を待つ。
(3)送信要求なら、ファイルを作成する。送信不要なら(1)に戻る。
(4)送信Bにメッセージでファイルが出来たことを知らせる。
(5)送信Bの返事を待つ。
(6)(1)に戻る。

--送信B--
(1)命令Aから要求の問い合わせを待つ。
(2)命令Aにメッセージで要求の有無を送信。
(3)要求無しなら(1)に戻る。
(4)命令Aからファイルの完成メッセージが届くのを待つ。
(5)ファイルを読んで何らかの方法で送信する。
(6)ファイルを削除する。
(7)命令Aにメッセージで送信が完了したことを知らせる。
(8)(1)に戻る。

相互の通信にはWindowsAPIのPostMessageを使用する予定です。
ただし、両方のアプリにhWndが必要なので両方ともウィンドアプリである必要があります。
http://yokohama.cool.ne.jp/chokuto/urawaza/api/PostMessage.html

アプリ毎に整理してみました。分からないところは想像で書いています。

--命令A--
(1)「命令A→通信C」のファイルを作成。「送信Bが送信Aに対して、データの要求をしているのかを判別するデータを送信しろ」を送る。
(2)「通信C→送信B、命令A」のファイルを監視。「命令Aにデータ要求」が書き込まれるの待つ。
(3)「命令A→通信C」のファイル2を作成。「送信Bの要求データ」を作成する。
(4)「通信C→送信B、命令A」のファイルを監視。「送信Bはデータの要求をしていない」に書き換わるの待...続きを読む

Q親スレッドが子スレッドを監視する方法について(マルチスレッド)

こんにちは。
私は、A端末から送信されたパケットをB端末で受信し、B端末で受信したそのパケットを再度、A端末へ送信するというプログラムを作成しました。

Phase1.A端末(送信側)→B端末(受信側)
Phase2. B端末→A端末
ということです。

上記を実現するために、送信端末において、送信スレッド(親スレッド)と受信スレッド(子スレッド)を立てマルチスレッド処理を行っています。以下にプログラムの概要を示します。

main(int argc ,char *argv[]){
UDPSend(s_port,szServer);
}

static int UDPSend(unsigned short s_port,char *szServer){
hTh = (HANDLE)_beginthreadex(NULL, 0, UDPReceiveData, NULL, 0, &thID);
while((n = fread(send_Buf,1,SEND_DATA_SIZE,fp)) != 0) {
sendto(s1, send_Buf, n, 0, (LPSOCKADDR)&addrin1, sizeof(addrin1));
}
}
unsigned __stdcall UDPReceiveData(void *lpx){
while (1) {
size = recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen);
return 0;
}
}

UDPSend関数にて、パケットをB端末へ送信。UDPReceiveData関数にて、B端末からのパケットを受信しています。この場合、UDPSend関数(スレッド?)がUDPReceiveData関数より先に、終わってしまう場合が生じると思っているのですが。

UDPSend関数がUDPReceiveData関数を監視する方法があるのでしょうか?

よろしくお願いします。

こんにちは。
私は、A端末から送信されたパケットをB端末で受信し、B端末で受信したそのパケットを再度、A端末へ送信するというプログラムを作成しました。

Phase1.A端末(送信側)→B端末(受信側)
Phase2. B端末→A端末
ということです。

上記を実現するために、送信端末において、送信スレッド(親スレッド)と受信スレッド(子スレッド)を立てマルチスレッド処理を行っています。以下にプログラムの概要を示します。

main(int argc ,char *argv[]){
UDPSend(s_port,szServer);
}

static int UDPSe...続きを読む

Aベストアンサー

「スレッドの生成~終了待ち~ハンドル解放」を main() でやってみてはいかがですか?
#include <windows.h>
#include <stdio.h>
#include <process.h>
main(){
  HANDLE hTh;
  unsinged thID;
  hTh = createthreadex(省略);
  送信処理();
  WaitForSingleObject( hTh, INFINITE ); //受信スレッド終了待ち
  CloseHandle(hTh);
}
送信処理(){
  ・・・・
  sendto(省略);  
  ・・・・
}
受信処理(){
  ・・・・
  recvfrom(省略);
  ・・・・
}

参考URL:http://msdn2.microsoft.com/ja-jp/library/kdzttdcb.aspx

Qマルチスレッドについて、WindowsやLinuxで動作する簡単なサンプルを探しています。

マルチスレッドについて、WindowsやLinuxで動作する簡単なサンプルを探しています。C++でなく、Cで行いたいです。
書籍も購入しようか考えていますが、マルチスレッドについて理解すべきキーワードがどんなものかまったくわかりませんので、熟知している方、列記していただければ助かります。

今のところ、「プロセス」のキーワードは重要だと思いますが他はどんなものがあるのでしょうか?

Aベストアンサー

★Windows の OS のみ紹介します。
・『猫でもわかるプログラミング』は回答者 No.2 さんがアドバイスしていますので別の
 サイトを紹介します。
・http://wisdom.sakura.ne.jp/system/winapi/win32/index.html→『標準 Windows API』
 このサイトに5だけマルチスレッドとプロセスに関するページがあります。
 http://wisdom.sakura.ne.jp/system/winapi/win32/win143.html→『138.マルチスレッド』
 http://wisdom.sakura.ne.jp/system/winapi/win32/win144.html→『139.スレッドの待機』
 http://wisdom.sakura.ne.jp/system/winapi/win32/win145.html→『140.スレッドの同期』
 http://wisdom.sakura.ne.jp/system/winapi/win32/win146.html→『141.プロセスの同期』
 http://wisdom.sakura.ne.jp/system/winapi/win32/win147.html→『142.プロセス』

本:
・http://www.amazon.co.jp/dp/4900900699/→『Win32/C++ マルチスレッドプログラミング詳説』

その他:
・http://homepage1.nifty.com/daccho/program/sdk/thread1.htm→『スレッドを使用したサンプルプログラムソース及びまとめ』

参考URL:http://wisdom.sakura.ne.jp/system/winapi/win32/win143.html

★Windows の OS のみ紹介します。
・『猫でもわかるプログラミング』は回答者 No.2 さんがアドバイスしていますので別の
 サイトを紹介します。
・http://wisdom.sakura.ne.jp/system/winapi/win32/index.html→『標準 Windows API』
 このサイトに5だけマルチスレッドとプロセスに関するページがあります。
 http://wisdom.sakura.ne.jp/system/winapi/win32/win143.html→『138.マルチスレッド』
 http://wisdom.sakura.ne.jp/system/winapi/win32/win144.html→『139.スレッドの待機』
 http://wisdo...続きを読む

Qクラスでスレッド作成

VC++2008Express WIN32APIでRS232Cの通信用クラスを作成しています。
RS232Cの受信用スレッドを作成して
1ポートの受信処理をするようにはできます。
ですが
ポート追加するたびにクラスをインスタンス化して受信用スレッドを
作成したいのですが、スレッド作成するには使用する変数などを
staticにしないといけないため、クラスを複数インスタンス化できません。
どのような手法でクラスから複数スレッドを作成することができるのでしょうか?
分かりにくい説明ですが、参考になるものなどありましたら、
よろしくお願いします。

Aベストアンサー

>スレッド作成するには使用する変数などをstaticにしないといけない
staticにするのは、Thread関数に渡す、関数ポインタだけで良いのでは?
以下は、ざっくりですが。

class rs232c
{
public:
rs232c(パラメータ色々);
Start(); // Thread開始用の関数
private:
static unsigned int __stdcall ThreadLoop(void* parm)
};
みたいにしといて、
rs232c::Start()
{
//thisでインスタンスのポインタを渡す
_beginthreadex(NULL, 0, rs232c::ThreadLoop, this, 0, NULL);
}

rs232c::ThreadLoop(void* parm)
{
// キャストしてインスタンスを使う
rs232c* instance = parm;

// 受信処理
}

int main()
{
rs232c hoge(パラメータ色々);
hoge->Start(); // 受信処理開始
}
こんな感じで、いけると思いますよ。

>スレッド作成するには使用する変数などをstaticにしないといけない
staticにするのは、Thread関数に渡す、関数ポインタだけで良いのでは?
以下は、ざっくりですが。

class rs232c
{
public:
rs232c(パラメータ色々);
Start(); // Thread開始用の関数
private:
static unsigned int __stdcall ThreadLoop(void* parm)
};
みたいにしといて、
rs232c::Start()
{
//thisでインスタンスのポインタを渡す
_beginthreadex(NULL, 0, rs232c::ThreadLoop, this, 0, NULL);
}

rs232c::ThreadLoop(void* parm)
{
// ...続きを読む

QC++ビルダーでイベント付きスレッドクラスを作成したい

C++系(主にボーランドビルダー)でVBの様なイベント付きクラスを作成したいのです。

単なるスレッドクラスの定義は:
//----------------------------------------------
// クラス
// スレッドクラスより派生
//----------------------------------------------
class CUserClass : public TThread
{
private:
AnsiString aa;
HANDLE hr;// ハンドル
protected:
HWND FormHandle; // 親フォームハンドル
void __fastcall Execute();// スレッドメイン処理
public:
__fastcall CUserClass(bool,AnsiString ,HWND ); // コンストラクタ
__fastcall ~CUserClass(); // デストラクタ
};

でいいのですが・・・。

何かクラス側で変化があったとき、クラスを使う親側モジュールにイベントを発生させたいのですが。
クラス側から親側に
SendMessage( 親側ハンドル, 送りたいメッセージ, 0, 0 );
でメッセージを送る方法があるのですが、これだと親側がクラスでないといけないし、送りたいメッセージが固定となるし・・・。

よい方法を教えてください。

C++系(主にボーランドビルダー)でVBの様なイベント付きクラスを作成したいのです。

単なるスレッドクラスの定義は:
//----------------------------------------------
// クラス
// スレッドクラスより派生
//----------------------------------------------
class CUserClass : public TThread
{
private:
AnsiString aa;
HANDLE hr;// ハンドル
protected:
HWND FormHandle; // 親フォームハンドル
void __fastcall Execute();// スレッドメイン処理
public:
...続きを読む

Aベストアンサー

関数を宣言する
その関数を「型」とするフィールドを作る
コンストラクタでnullに初期化する
使う側で、そのフィールドに飛ばしたい関数のアドレスを設定する
イベントを発生させたいタイミングで、フィールドがnullでなければコールする


ってかんじかな?

BCBなら「コンポーネント開発者ガイド」に「イベントの作成」という章があります。


人気Q&Aランキング

おすすめ情報