看板 C_and_CPP 關於我們 聯絡資訊
感謝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:http://codepad.org/pV1YekoS 09/11 11:29
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)