作者wope (獨立黑色色彩)
看板C_and_CPP
標題Re: [問題] 如何開啟多執行緒?
時間Sat Sep 11 09:40:42 2010
感謝loveme00835的幫忙
多執行緒Thread的MSDN
http://ppt.cc/MT56
兩個函數的例子
http://codepad.org/pV1YekoS
單執行緒(原來的)寫如下
1 private: System::Void button1_Click(Syst...){
2 double no1,no2,QQ,qq;
3 no1=Convert::ToDouble(textBox1->Text);
4 no2=Convert::ToDouble(textBox2->Text);
5
6 QQ=Fun1(no1,no2);
7 label2->Text=QQ.ToString();
8
9 qq=Fun2(no1,no2);
10 label3->Text=qq.ToString();
11
12 }
13 double Fun1(double A,double B){
14 doule p;
15 ...A...
16 return p;
17 }
18 double Fun2(double A,double B){...B...}
19 doule p;
20 ...B...
21 return p;
22 }
改成多執行結的寫法
1 using namespace System;
2 using namespace System::Threading;
3 using <mscorlib.dll>
4
5 private: System::Void button1_Click(System...){
6 // 取得要傳遞給函式的引數
7 double a = Convert::ToInt32(textBox1->Text);
8 double b= Convert::ToInt32(textBox2->Text);
9 // 將引數包裝成一物件
10 Data^ Data1 = gcnew Data(a,b );
11 Data^ Data2 = gcnew Data(a,b );
12 // 建立執行緒物件並以特定方法位址作為呼叫對象
13 Thread^ Thread1 = gcnew Thread( gcnew ParameterizedThreadStart
(&Form1:: OFun1) );
14 Thread^ Thread2 = gcnew Thread( gcnew ParameterizedThreadStart
(&Form1:: OFun2) );
15 // 開始執行緒並傳遞引數
16 Thread1->Start( Data1 );
17 Thread2->Start( Data2 );
18 // 等待連乘結束, 取出結果
19 Thread1->Join();
20 label2->Text=Data1->result.ToString();
21 // 等待連加結束, 取出結果
22 Thread2->Join();
23 label3->Text=Data2->result.ToString();
24 }
25 // 第一個函數物件
26 static void OFun1(Object^ obj ){
27 Data^ data = (Data^)obj;
28 double p;
29 ...A...
30 data->result =p;
31 }
32 // 第二個函數物件
33 static void Ofun2(Object^ obj )
34 {
35 Data^ data = (Data^)obj;
36 double p;
37 ...B...
38 data->result =p;
39 }
40 // 封裝引數的類別
41 ref class Data{
42 public: Data( double a, double b )
43 {
44 this->a=a;
45 this->b=b;
46 }
47
48 public: double a;
49 public: double b;
50 // 儲存計算結果
51 public: double result;
52 };
----------------------------------------------------------------------------
之前的問題如下
----------------------------------------------------------------------------
不好思意 我是C++新手
繼上週loveme00835提供了
http://ppt.cc/MT56網址之後
看了之後還是很多地方不懂
想請較幾個問題
問題一:在不改成物件下 做出兩隻回傳值的執行緒
...button_...{
開起第一個執行緒(執行Fun1回傳至SolA)
開起第二個執行緒(執行Fun2回傳至SolB)
等兩個執行緒跑完再傳值至Label
}
問題二:如果一定要改物件 才有機會產生多埶行緒的話我的Fun1要怎麼改
double Fun1(double A,double B){...}
這個問題已經卡了很久還是不會@@
先謝過大家了
-------------------------上週的問題--------------------------------
1)在window Forms
2)目前有兩個函數Fun1,Fun2 , A與B為變數
double Fun1(double A,double B){...}//已寫好回傳double
double Fun2(double A,double B){...}//已寫好回傳double
3)目前的寫法是在button1中可以執行此兩個函數
1 private: System::Void button1_Click(Syst...){
2 double no1,no2,QQ,qq;
3 no1=Convert::ToDouble(textBox1->Text);
4 no2=Convert::ToDouble(textBox2->Text);
5
6 QQ=Fun1(no1,no2);
7 label2->Text=QQ.ToString();
8
9 qq=Fun2(no1,no2);
10 label3->Text=qq.ToString();
11
12 }
開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
VC++ 2005 .net
--
→ loveme00835:
http://ppt.cc/MT56 09/04 17:10
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.63.199
推 Bencrie:用thread是因為Fun1&Fun2運算時間長,又不想讓Window hang 09/11 10:39
→ Bencrie:住嗎 ? 09/11 10:39
因為之後的計算同時要用這兩個值
而且這兩個計算都要花一些時間(有點久)
→ loveme00835:將要傳遞的引數s封裝成物件, 再傳給執行緒做修改 09/11 11:28
→ loveme00835:不好意思 7 8 行 typo 09/11 11:32
我把原來的for換成我已寫好的函數
原來的如下(39-41行)
for(value = data->result + 1;value <= data->secondParameter; ++value )
{ data->result *= value;}
換成
data->result=FunB(data->firstParameter,data->secondParameter);
但出現錯誤
錯誤 error C2352: '介面測試::Form1::FunB' : 非靜態成員函式的呼叫不合法
(我在試radioButton1要如何加進來)
double FunB(double no1,double no2){
double A=-1;
if (radioButton1->Checked{A=no1+no2;}
else if(radioButton2->Checked){A=no1-no2;}
return A;
}
不知道要如何改@@
※ 編輯: wope 來自: 140.112.63.199 (09/11 17:46)
※ 編輯: wope 來自: 140.112.63.199 (09/11 21:03)
→ loveme00835:static ... 09/11 21:06
→ loveme00835:執行緒不能直接對UI物件作存取, 雖然也是可以做, 不過 09/11 21:14
→ loveme00835:會麻煩得多, 你上網查查多執行緒相關的資料吧, 多到爆 09/11 21:15
※ 編輯: wope 來自: 140.112.63.199 (10/23 09:45)