<プログラム環境>
Windows XP
VC++6.0
MFC AppWizard(exe)
ダイアログベース
<質問概略>
CWinThread*を使って無限ループのスレッドを作ったのですが、
無限ループのスレッドをもう一つ作り、同時に実行しようとするとアクセスバイオレーションのエラーでます。
複数スレッドの作り方を教えていただけますと幸いです。
<質問詳細>
現状の正常に実行できるソースの必要最小限を書きます。
<.h>
class CMyDlg : public CDialog{
public:
static UINT ThreadFunc( LPVOID pParam );
void Thread(); // スレッドの処理
protected:
CWinThread* m_pThread;//スレッドのアドレス
};
<.cpp>
void CMyDlg::OnButton(){
m_pThread = AfxBeginThread( ThreadFunc, this );
for(;;) /*無限ループ処理1*/ ;
}
UINT CMyDlg::ThreadFunc( LPVOID pParam ){
((CMyDlg*)pParam)->Thread();
return 0;
}
void CMyDlg::Thread(){
for(;;) /*無限ループ処理2*/ ;
}
これに、
void CMyDlg::Thread2(){
for(;;) /*無限ループ処理3*/ ;
}
のようなスレッドを追加したいのですが全然出来ません。
宜しければご指摘お願い致します。
A 回答 (12件中11~12件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
>「静的な中で呼び出しがおかしい」のようなエラーが出ます。
> static UINT ThreadFunc1( LPVOID pParam );
> static UINT ThreadFunc2( LPVOID pParam );
上記は静的な関数なので、この中で呼び出す物も、
それと同じ実行範囲出なければ行けません。
呼び出そうとするクラスのメソッドも静的にする必要があります。
> MessageBox()をコーディングするとエラーがでます。
どんな?
aris-wiz様、有難うございます。
エラーは「静的でないメンバ関数の中で呼び出しが正しくありません。」
でした。
MessageBox()を静的にすることができるのでしょか?
No.1
- 回答日時:
<.h>
class CMyDlg : public CDialog{
public:
static UINT ThreadFunc1( LPVOID pParam );
static UINT ThreadFunc2( LPVOID pParam );
// これは不要
// void Thread(); // スレッドの処理
protected:
CWinThread* m_pThread1;//スレッドのアドレス
CWinThread* m_pThread2;//スレッドのアドレス
};
<.cpp>
void CMyDlg::OnButton(){
m_pThread1 = AfxBeginThread( ThreadFunc1, this );
m_pThread2 = AfxBeginThread( ThreadFunc2, this );
// これも不要
// for(;;) /*無限ループ処理1*/ ;
// メッセージポンプを止めてしまうのは得策ではありません
}
UINT CMyDlg::ThreadFunc1( LPVOID pParam ){
// このような使い方をしない
//((CMyDlg*)pParam)->Thread();
for ( ;; ) {
// 何かの処理
}
return 0;
}
UINT CMyDlg::ThreadFunc2( LPVOID pParam ){
// このような使い方をしない
//((CMyDlg*)pParam)->Thread();
for ( ;; ) {
// 何かの処理
}
return 0;
}
別のスレッドから CMyDlgへ何らかのアクションを起こすなら
PostMessageやSendMessageでやり取りしましょう
やり取りするメッセージはRegisterWindowMessageなどで作成します
これを CMyDlgのメッセージマップで振り分けるようにしましょう
redfox63様、有難う御座います。
PostMessage、SendMessage、RegisterWindowMessageのリファレンスは調べたのですが、今ひとつ理解できませんでしたが、教えていただいた通りにコーディングして、実行できました。
しかし、2つ問題が発生しました。
<問題1>
void CMyDlg::Thread(){
for(;;) /*無限ループ処理2*/ ;
}
このメンバ関数内で他のメンバ関数を呼び出していたのですが、
「静的な中で呼び出しがおかしい」のようなエラーが出ます。
また、ダイアログで宣言したエディットボックスのメンバ変数(CString)を使用することにも同様のエラーがでます。
<問題2>
MessageBox()をコーディングするとエラーがでます。
上記2点の問題によって、スレッド内の計算結果や、エラー発生時の警告等を文字列(CString)で表示する手段が分からなくなりました。教えていただいた手法ではスレッド内で文字列を表示することは出来ないのでしょうか?
宜しければご指摘の程お願いいたいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- グループウェア slackについて取り急ぎ教えて頂きたいことがあります 2 2022/04/08 09:05
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- その他(プログラミング・Web制作) uwscとWinShotを使いスクリーンショットを撮る 1 2022/06/30 21:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スレッドの監視方法について
-
WaitForSingleObjectの使い方に...
-
スレッドの監視方法
-
スレッドの終了の仕方
-
スレッドにて同一メモリの書き...
-
CWnd::OnTimerのスレッドの取得
-
スレッドの安全な終了のさせ方
-
C# スレッド終了の監視について
-
メモリアクセスの競合について
-
win32 スレッドのハンドルついて
-
マルチコアを有効利用するプロ...
-
別スレッドのデータを受信できない
-
マルチスレッドについて
-
C++でマルチスレッド処理をさせ...
-
msec単位のWait Timerが作れない!
-
頭冷やし終えました。スクリー...
-
MFC モーダルダイアログに動的...
-
VB2005 シリアル通信のClose処理
-
Macターミナルで実行中のプログ...
-
VBSの処理中一旦処理を止めて再...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
スレッドにて同一メモリの書き...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
Windows上で、シグナル(SIGTERM...
-
スレッドの終了の仕方
-
スレッドの安全な終了のさせ方
-
CWnd::OnTimerのスレッドの取得
-
MFC通信プログラムマルチスレッ...
-
Linuxでスレッド優先度って変え...
-
.netアプリへのSendMessageでフ...
-
VB2005 シリアル通信のClose処理
-
スレッドの終了はどうやるんで...
-
別スレッドからメインダイアロ...
-
マルチスレッドについて
-
マルチスレッドプログラミング...
-
別スレッドのデータを受信できない
-
特定のスレッドの破棄
-
.NetのBackgroundWorkerクラス...
-
msec単位のWait Timerが作れない!
おすすめ情報