Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: cách sử dụng BackgroundWorker trong VC++ ???

  1. #1
    Ngày gia nhập
    08 2012
    Bài viết
    71

    Mặc định cách sử dụng BackgroundWorker trong VC++ ???

    Câu hỏi như tiêu đề. Mình đã tìm trong diễn đàn và đọc các đường dẫn trong và cả ngoài diễn đàn ( chẳng hạn như ở đây hoặc ở đây ...)
    Tuy nhiên, 1 là toàn sử dụng C#. 2 là chỉ cho chạy hàm FOR bình thường ( hàm FOR mình cũng đã cho chạy thử rồi, kết quả ko như ý muốn nhưng đại khái là cũng chạy ).
    đây là code của mình ( code test )
    C Code:
    1. #pragma once
    2.  
    3. namespace test_deligate {
    4.  
    5.     using namespace System;
    6.     using namespace System::IO;
    7.     using namespace System::IO::Ports;
    8.  
    9.     using namespace System::ComponentModel;
    10.     using namespace System::Collections;
    11.     using namespace System::Windows::Forms;
    12.     using namespace System::Data;
    13.     using namespace System::Drawing;
    14.     using namespace System::Diagnostics;
    15.     using namespace System::Text::RegularExpressions;
    16.  
    17.     /// <summary>
    18.     /// Form1 の概要
    19.     ///
    20.     /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた
    21.     ///          マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを
    22.     ///          変更する必要があります。この変更を行わないと、
    23.     ///          デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、
    24.     ///          正しく相互に利用できなくなります。
    25.     /// </summary>
    26.     public ref class Form1 : public System::Windows::Forms::Form
    27.     {
    28.     public:
    29.         delegate void ChuyenDuLieu(String ^text);
    30.         Form1(void)
    31.         {
    32.             InitializeComponent();
    33.             //
    34.             //TODO: ここにコンストラクタ コードを追加します
    35.             //
    36.         }
    37.  
    38.     protected:
    39.         /// <summary>
    40.         /// 使用中のリソースをすべてクリーンアップします。
    41.         /// </summary>
    42.         ~Form1()
    43.         {
    44.             if (components)
    45.             {
    46.                 delete components;
    47.             }
    48.         }
    49.     private: System::Windows::Forms::ListBox^  listBox1;
    50.     protected:
    51.     private: System::Windows::Forms::ListBox^  listBox2;
    52.     private: System::Windows::Forms::Button^  button1;
    53.     private: System::Windows::Forms::Button^  button2;
    54.     private: System::ComponentModel::BackgroundWorker^  backgroundWorker1;
    55.     private: System::Windows::Forms::Label^  label1;
    56.     private: System::Windows::Forms::Button^  button3;
    57.     private: System::Windows::Forms::ProgressBar^  progressBar1;
    58.     private: System::Windows::Forms::Label^  label2;
    59.  
    60.     private:
    61.         /// <summary>
    62.         /// 必要なデザイナ変数です。
    63.         /// </summary>
    64.         System::ComponentModel::Container ^components;
    65.  
    66. #pragma region Windows Form Designer generated code
    67.         /// <summary>
    68.         /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
    69.         /// コード エディタで変更しないでください。
    70.         /// </summary>
    71.         void InitializeComponent(void)
    72.         {
    73.             this->listBox1 = (gcnew System::Windows::Forms::ListBox());
    74.             this->listBox2 = (gcnew System::Windows::Forms::ListBox());
    75.             this->button1 = (gcnew System::Windows::Forms::Button());
    76.             this->button2 = (gcnew System::Windows::Forms::Button());
    77.             this->backgroundWorker1 = (gcnew System::ComponentModel::BackgroundWorker());
    78.             this->label1 = (gcnew System::Windows::Forms::Label());
    79.             this->button3 = (gcnew System::Windows::Forms::Button());
    80.             this->progressBar1 = (gcnew System::Windows::Forms::ProgressBar());
    81.             this->label2 = (gcnew System::Windows::Forms::Label());
    82.             this->SuspendLayout();
    83.             //
    84.             // listBox1
    85.             //
    86.             this->listBox1->FormattingEnabled = true;
    87.             this->listBox1->ItemHeight = 12;
    88.             this->listBox1->Location = System::Drawing::Point(13, 13);
    89.             this->listBox1->Name = L"listBox1";
    90.             this->listBox1->Size = System::Drawing::Size(228, 376);
    91.             this->listBox1->TabIndex = 0;
    92.             //
    93.             // listBox2
    94.             //
    95.             this->listBox2->FormattingEnabled = true;
    96.             this->listBox2->ItemHeight = 12;
    97.             this->listBox2->Location = System::Drawing::Point(415, 12);
    98.             this->listBox2->Name = L"listBox2";
    99.             this->listBox2->Size = System::Drawing::Size(227, 376);
    100.             this->listBox2->TabIndex = 1;
    101.             //
    102.             // button1
    103.             //
    104.             this->button1->Location = System::Drawing::Point(257, 13);
    105.             this->button1->Name = L"button1";
    106.             this->button1->Size = System::Drawing::Size(152, 36);
    107.             this->button1->TabIndex = 2;
    108.             this->button1->Text = L"<<< Add 1 -> 10000 Deligate";
    109.             this->button1->UseVisualStyleBackColor = true;
    110.             this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    111.             //
    112.             // button2
    113.             //
    114.             this->button2->Location = System::Drawing::Point(257, 94);
    115.             this->button2->Name = L"button2";
    116.             this->button2->Size = System::Drawing::Size(152, 23);
    117.             this->button2->TabIndex = 3;
    118.             this->button2->Text = L"Add <<< to >>>";
    119.             this->button2->UseVisualStyleBackColor = true;
    120.             this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);
    121.             //
    122.             // backgroundWorker1
    123.             //
    124.             this->backgroundWorker1->DoWork += gcnew System::ComponentModel::DoWorkEventHandler(this, &Form1::backgroundWorker1_DoWork);
    125.             this->backgroundWorker1->RunWorkerCompleted += gcnew System::ComponentModel::RunWorkerCompletedEventHandler(this, &Form1::backgroundWorker1_RunWorkerCompleted);
    126.             this->backgroundWorker1->ProgressChanged += gcnew System::ComponentModel::ProgressChangedEventHandler(this, &Form1::backgroundWorker1_ProgressChanged);
    127.             //
    128.             // label1
    129.             //
    130.             this->label1->AutoSize = true;
    131.             this->label1->Location = System::Drawing::Point(257, 253);
    132.             this->label1->Name = L"label1";
    133.             this->label1->Size = System::Drawing::Size(21, 12);
    134.             this->label1->TabIndex = 4;
    135.             this->label1->Text = L"NO";
    136.             //
    137.             // button3
    138.             //
    139.             this->button3->Location = System::Drawing::Point(257, 182);
    140.             this->button3->Name = L"button3";
    141.             this->button3->Size = System::Drawing::Size(152, 23);
    142.             this->button3->TabIndex = 5;
    143.             this->button3->Text = L"Stop in List 1";
    144.             this->button3->UseVisualStyleBackColor = true;
    145.             this->button3->Click += gcnew System::EventHandler(this, &Form1::button3_Click);
    146.             //
    147.             // progressBar1
    148.             //
    149.             this->progressBar1->Location = System::Drawing::Point(13, 425);
    150.             this->progressBar1->Maximum = 10000;
    151.             this->progressBar1->Name = L"progressBar1";
    152.             this->progressBar1->Size = System::Drawing::Size(629, 23);
    153.             this->progressBar1->Step = 1;
    154.             this->progressBar1->TabIndex = 6;
    155.             //
    156.             // label2
    157.             //
    158.             this->label2->AutoSize = true;
    159.             this->label2->Location = System::Drawing::Point(12, 392);
    160.             this->label2->Name = L"label2";
    161.             this->label2->Size = System::Drawing::Size(35, 12);
    162.             this->label2->TabIndex = 7;
    163.             this->label2->Text = L"label2";
    164.             //
    165.             // Form1
    166.             //
    167.             this->AutoScaleDimensions = System::Drawing::SizeF(6, 12);
    168.             this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    169.             this->ClientSize = System::Drawing::Size(654, 488);
    170.             this->Controls->Add(this->label2);
    171.             this->Controls->Add(this->progressBar1);
    172.             this->Controls->Add(this->button3);
    173.             this->Controls->Add(this->label1);
    174.             this->Controls->Add(this->button2);
    175.             this->Controls->Add(this->button1);
    176.             this->Controls->Add(this->listBox2);
    177.             this->Controls->Add(this->listBox1);
    178.             this->Name = L"Form1";
    179.             this->Text = L"Form1";
    180.             this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
    181.             this->ResumeLayout(false);
    182.             this->PerformLayout();
    183.  
    184.         }
    185. #pragma endregion
    186.     private: void SetText(String ^text)
    187.              {
    188.                  if(this->listBox2->InvokeRequired)
    189.                  {
    190.                      Debug::WriteLine("invoke require");
    191.                      ChuyenDuLieu ^d = gcnew ChuyenDuLieu(this, &test_deligate::Form1::SetText);
    192.                      this->BeginInvoke(d, text);
    193.                  }
    194.                  else
    195.                  {
    196.                      listBox1->Items->Add(text);
    197.                  }
    198.              }
    199.  
    200.  
    201.     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    202.                 backgroundWorker1->RunWorkerAsync();
    203.              }
    204.     private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
    205.                 // String ^ttt;
    206.                  int i=0;
    207.                  String ^dulieu;
    208.                  Debug::WriteLine("vua khai bao i xong");
    209.                  for(i; i<10000; i++)
    210.                  {
    211.                      dulieu=i.ToString();
    212.                      SetText(dulieu);
    213.                      backgroundWorker1->ReportProgress(i);
    214.                      if(backgroundWorker1->CancellationPending)
    215.                      {
    216.                          e->Cancel=true;
    217.                          backgroundWorker1->ReportProgress(0);
    218.                          return;
    219.                      }
    220.                      
    221.                  }           
    222.              }
    223. private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    224.              int i=listBox1->Items->Count;
    225.              for(int j=0; j<i; j++)
    226.              {
    227.                  listBox2->Items->Add(listBox1->Items[j]);
    228.                          }
    229.              Debug::WriteLine("Sum Lines : " + j);
    230.              Debug::WriteLine("FINISH");
    231.          }
    232. private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    233.              backgroundWorker1->WorkerReportsProgress = true;
    234.              backgroundWorker1->WorkerSupportsCancellation = true;
    235.  
    236.              backgroundWorker1->DoWork += gcnew DoWorkEventHandler(this, &test_deligate::Form1::backgroundWorker1_DoWork);
    237.              backgroundWorker1->ProgressChanged += gcnew ProgressChangedEventHandler(this, &test_deligate::Form1::backgroundWorker1_ProgressChanged);
    238.              backgroundWorker1->RunWorkerCompleted += gcnew RunWorkerCompletedEventHandler(this, &test_deligate::Form1::backgroundWorker1_RunWorkerCompleted);
    239.  
    240.          }
    241. private: System::Void backgroundWorker1_ProgressChanged(System::Object^  sender, System::ComponentModel::ProgressChangedEventArgs^  e) {
    242.              progressBar1->Value = e->ProgressPercentage;
    243.              label2->Text="processing ... " + progressBar1->Value.ToString() + "% .....";
    244.          }
    245. private: System::Void backgroundWorker1_RunWorkerCompleted(System::Object^  sender, System::ComponentModel::RunWorkerCompletedEventArgs^  e) {
    246.             // MessageBox::Show("FINISH WORKER");
    247.          }
    248. private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) {
    249.              if(backgroundWorker1->IsBusy)
    250.              {
    251.                 backgroundWorker1->CancelAsync();
    252.              }
    253.              Debug::WriteLine("Line in listbox11 : " + listBox1->Items->Count);
    254.          }
    255. };
    256. }
    Khi chạy, ko thể bấm ngừng dc ( ở button3_click ). Và trong khi nó đọc thì ko thể thao tác trên các nút khác.
    Mình muốn làm thử 1 ví dụ : add vào list box 1 giá trị từ 1 đến 100.000. Trong thời gian add, thì khi bấm vào button2 nó sẽ chuyển dữ liệu từ listbox1 sang listbox2 ---> trong cùng 1 thời điểm ở 1 khoảng thời gian nào đó, list box 1 vừa được add và listbox2 sẽ lấy dữ liệu hiện có của listbox1 và add vào ( dĩ nhiên là listbox1 vẫn đang được add ở 1 vị trí thứ n nào đó ).
    Bạn nào có thể chỉ cho mình biết, trong project của mình sử dụng background và delegate mình bị sai chỗ nào ? Và nguyên do sai ???
    Cám ơn nhiều !!!
    Đã được chỉnh sửa lần cuối bởi shizuoka : 17-12-2012 lúc 02:31 PM.
    Trước khi là PRO thì chắc chắn sẽ là CON GÀ
    Và mình thì đang ở mức độ CON GÀ

  2. #2
    Ngày gia nhập
    10 2011
    Bài viết
    14


Các đề tài tương tự

  1. Kết hợp backgroundWorker với 1 hàm trong C# như thế nào?
    Gửi bởi H.Thuong trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 15-05-2012, 11:28 AM
  2. Không stop được BackgroundWorker
    Gửi bởi dotritiep trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 09-09-2011, 10:03 PM
  3. Algorithm Sử dụng BackgroundWorker để lặp trong listview
    Gửi bởi okitakimura trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 26-03-2011, 11:23 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn