したがって、私はC ++に少し慣れていません(これまでに4〜6か月+本から学ぶ(教師ではない))。この問題は私の誤解の結果である可能性が高いことを理解していますが、グーグルで検索してもまだわかりませんたくさんの検索用語...私もstackoverflowを試して読んだ: クロススレッド操作が無効です:コントロール 'Form1'は、それが作成されたスレッド以外のスレッドからアクセスされました クロススレッド操作が無効です:他のスレッドからアクセスされたコントロール クロススレッドコードを呼び出すための最良の方法で作成されたスレッドよりも? これに対する解決策を作成しようとしましたが (以下で確認できます)、コードを c# から c++ に変換できませんでした (私は C# ユーザーではないので...) ( from: Crossthread operation ) で解決できます有効ではありません... - VB.NET ):
listView1->CheckForIllegalCrossThreadCalls = false;
しかし、それは良い習慣ではないので、代替手段を探しています。
スレッドでこの clr コードを呼び出そうとすると:
void CClient::add(){
lvhandle = (HWND)project1::Form1::ClrForm1->listView1->Handle.ToPointer();
/* as you can see here, I tried to figure out how to use MethodInvoker but failed...
if(project1::Form1::ClrForm1->listView1->InvokeRequired){
lvhandle = (HWND)project1::Form1::ClrForm1->listView1->Handle.ToPointer();
//project1::Form1::ClrForm1->listView1->Invoke(gcnew System::Windows::Forms::MethodInvoker(this, &annoyme));
}
else
{
lvhandle = (HWND)project1::Form1::ClrForm1->listView1->Handle.ToPointer();
}*/
item.pszText = LPSTR_TEXTCALLBACK; // Sends an LVN_GETDISPINFO message.
item.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_STATE;
item.stateMask = 0;
item.iSubItem = 0;
item.state = 0;
item.pszText = L"test";
item.lParam = 0;
ListView_InsertItem(lvhandle, &item);
std::string lol = std::to_string(item.iItem);
String^ test;
test = marshal_as<String^>(lol);
project1::Form1::ClrForm1->Text = test;
}
それは私に例外を与えます:
Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.
ClrForm1 は次のように定義されます。
public ref class Form1 : public System::Windows::Forms::Form
{
public:
static Form1^ ClrForm1;
エントリポイントがトリガーされたときに作成します。
int main(array<System::String ^> ^args)
{
// Enabling Windows XP visual effects before any controls are created
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// Create the main window and run it
Form1::ClrForm1 = gcnew Form1();
Application::Run(Form1::ClrForm1);
return 0;
}
また、次のようにしてエラーを確認しました。
project1::Form1::ClrForm1->Text = "Test!0";
うまくいけば、私はこれを十分に詳しく説明して、応答を得ることができます >.<