合計 昨日 今日
インフォメーション: 現在、バックグラウンドメンテナンス中の為、繋がりにくかったり表示が遅い場合があります。

クラス内関数を用いた_beginthreadex

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: みそら
[URL]
Date: 2017年3月17日(金) 09:11
No: 1
(OFFLINE)

 クラス内関数を用いた_beginthreadex

ネットで調べたのですが、どうしても分からないことがあったのでトピックを立てさせていただきました。

Windows10にてVisual Studio 2017 Communityを用いてC++でプログラミングを行っています。

タイトルの通り、以下のようなクラス内に宣言した関数(Rate())をスレッド化してRate()とCalc()のマルチスレッドを行いたいと考えております。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
class C_Calc
{
    unsigned int thID;
    HANDLE hTh;
 
public:
    void Calc(void);
    static void executeLauncher(void* args);
    void Rate(void);
};


それにあたり、「クラス内関数 _beginthreadex」と検索することで上位に出てきた
http://d.hatena.ne.jp/kasei_san/20070612/p1
といったサイトを参考に作ったのですが、
コード[C++]: 全て選択
1
hTh = (HANDLE)_beginthreadex(NULL, 0, executeLauncher, NULL, 0, &thID);

としたところ、

コード E0167
型 "int (__stdcall *)(void *args)" の引数は型 "_beginthreadex_proc_type" のパラメーターと互換性がありません

と出てきます。
この時、executeLauncherはint __stdcallにしてみたり、voidにしてみたりunsigned intにしてみたりしています。

また、
コード[C++]: 全て選択
1
hTh = (HANDLE)_beginthreadex(NULL, 0, &executeLauncher, NULL, 0, &thID);

と「&」をつけてみたりもしましたがダメでした。

クラス内関数Rate()をスレッド化するにはどうしたらよいのでしょうか。
ご教授いただけますと幸いです。

Name: usao
[URL]
ハッカー(123,653 ポイント)
Date: 2017年3月17日(金) 09:51
No: 2
(OFFLINE)

 Re: クラス内関数を用いた_beginthreadex

Offtopic :
参考先と同様の形で書いてみては?

Name: かずま
[URL]
Date: 2017年3月17日(金) 12:08
No: 3
(OFFLINE)

 Re: クラス内関数を用いた_beginthreadex

void を unsigned に変更し、__stdcall を付ければコンパイルできますよ。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <windows.h>  // HANDLE
#include <process.h>  // _beginthreadex
 
class C_Calc
{
    unsigned int thID;
    HANDLE hTh;
 
public:
    void Calc(void);
    static unsigned __stdcall executeLauncher(void* args);
    void Rate(void);
 
    void start() {
        hTh = (HANDLE)_beginthreadex(NULL, 0, executeLauncher, NULL, 0, &thID);
    }
};
 
unsigned __stdcall C_Calc::executeLauncher(void*args)
{
    for (int i = 0; i < 3; i++) {
        std::cout << "executeLauncher\n";
        Sleep(300);
    }
    _endthread();
    return 0;
}
 
int main()
{
    C_Calc calc;
    calc.start();
    for (int i = 0; i < 3; i++) {
        std::cout << "main\n";
        Sleep(400);
    }
}

Name: かずま
[URL]
Date: 2017年3月17日(金) 17:16
No: 4
(OFFLINE)

 Re: クラス内関数を用いた_beginthreadex

みそら さんが書きました:クラス内関数Rate()をスレッド化するにはどうしたらよいのでしょうか。

Rate は executreLauncher から呼び出せばよいのではないでしょうか?
そのためには、_beginthreadex で、this を渡す必要があります。
また、_beginthreadex で始めたので、_endthreadex で終わるようにしてみました。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <windows.h>  // HANDLE, Sleep
#include <process.h>  // _beginthreadex, _endthreadex
 
class C_Calc
{
    unsigned int thID;
    HANDLE hTh;
 
public:
    void Calc();
    static unsigned __stdcall executeLauncher(void *args);
    void Rate();
 
    void start() {
        hTh = (HANDLE)_beginthreadex(NULL, 0, executeLauncher, this, 0, &thID);
    }
};
 
unsigned __stdcall C_Calc::executeLauncher(void *args)
{
    C_Calc *p = reinterpret_cast<C_Calc*>(args);
    p->Rate();
    _endthreadex(0);
    return 0;
}
 
void C_Calc::Calc()
{
    for (int i = 0; i < 3; i++) {
        std::cout << i << ": Calc\n";
        Sleep(600);
    }
}
 
void C_Calc::Rate()
{
    for (int i = 0; i < 3; i++) {
        std::cout << i << ": Rate\n";
        Sleep(400);
    }
}
 
int main()
{
    C_Calc calc;
    calc.start();
    calc.Calc();
}


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[11人]