Bonjour,
J'utilise Visual C++ 2005 express en WinForm.
J' essaye l'exemple http://drq.developpez.com/dotnet/articles/threads/ pour faire fonctionné un progressBar avec un thread, mais ma progressBar ne décolle pas. J'ai essayé d'adapter la doc pour du WinForm mais il doit y avoir un problème au niveau de l'Object.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
array<Object^>^ object = gcnew array<Object^>(12); // 12, essai aussi i.
this->Invoke(this->ProgressBarDelegate, object[i]);
Ma feuille ce lance, j'appuie sur mon button est rien ne ce passe. Je ferme par la croix windows et une erreur arrive :
Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans System.Windows.Forms.dll

Informations supplémentaires*: Impossible d'appeler Invoke ou BeginInvoke sur un contrôle tant que le handle de fenêtre n'a pas été créé.

Voici mon code complet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
 
#pragma once
 
namespace ThreadTest {
 
	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace System::Threading;
 
	/// <summary>
	/// Description résumée de Form1
	///
	/// AVERTISSEMENT*: si vous modifiez le nom de cette classe, vous devrez modifier la
	///          propriété 'Nom du fichier de ressources' de l'outil de compilation de ressource managée
	///          pour tous les fichiers .resx dont dépend cette classe. Dans le cas contraire,
	///          les concepteurs ne pourront pas interagir correctement avec les ressources
	///          localisées associées à ce formulaire.
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form {
			private : delegate void ProgressBarDelegateHandler(int step);
			private : ProgressBarDelegateHandler^ ProgressBarDelegate;
 
	public:
		Form1(void) {
			InitializeComponent();
			//
			//TODO*: ajoutez ici le code du constructeur
			// Sur appel du délégué, la méthode UpdateProgressBar est donc appelé
			ProgressBarDelegate = gcnew ProgressBarDelegateHandler(this, &ThreadTest::Form1::UpdateProgressBar);
		}
 
	protected:		
		/// <summary>
		/// Nettoyage des ressources utilisées.
		/// </summary>
		~Form1() {
			if (components) {
				delete components;
			}
		}
	private: System::Windows::Forms::ProgressBar^  progressBar1; 
	private: System::Windows::Forms::Button^  button1;
			 System::ComponentModel::Container ^components;
	private:
		/// <summary>
		/// Variable nécessaire au concepteur.
		/// </summary>
 
#pragma region Windows Form Designer generated code
		/// <summary>
		/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
		/// le contenu de cette méthode avec l'éditeur de code.
		/// </summary>
		void InitializeComponent(void)
		{
			this->progressBar1 = (gcnew System::Windows::Forms::ProgressBar());
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->SuspendLayout();
			// 
			// progressBar1
			// 
			this->progressBar1->Location = System::Drawing::Point(114, 49);
			this->progressBar1->Name = L"progressBar1";
			this->progressBar1->Size = System::Drawing::Size(350, 35);
			this->progressBar1->TabIndex = 0;
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(226, 117);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(103, 32);
			this->button1->TabIndex = 1;
			this->button1->Text = L"button1";
			this->button1->UseVisualStyleBackColor = true;
			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click_1);
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(668, 273);
			this->Controls->Add(this->button1);
			this->Controls->Add(this->progressBar1);
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->ResumeLayout(false);
 
		}
#pragma endregion
//*******************************************************
	private: System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e) {
			progressBar1->Minimum = 0;
			progressBar1->Maximum = 10;
			// Lancement du thread
			Thread^ t = gcnew Thread(gcnew ThreadStart(this, &ThreadTest::Form1::ThreadProcess));
			t->Start();
		}
//***************************************
		private: void ThreadProcess() {
			for(int i = 0 ; i < 11 ; i++) {
				// Déclenche la mise à jour de l'interface
				array<Object^>^ object = gcnew array<Object^>(12);
				this->Invoke(this->ProgressBarDelegate, object[i]);  //, gcnew object[] {i}
				Thread::Sleep(1000);
			}
		}
//****************************************		
		private: void UpdateProgressBar(int step) {
			// Mise à jour de la barre de progression
			progressBar1->Value = step;
		}
//***********************************************************
};
}
De l'aide serait la bien venu.

Merci d'avance.