當前位置:首頁 » 密碼管理 » c控制項跨線程訪問

c控制項跨線程訪問

發布時間: 2023-04-15 16:20:53

1. C# 跨線程調用窗體控制項

Read()函數性能太低了,阻塞了電子眼觸發函數,你需要轉變下思路,使用非同步隊列來處理電子眼數據與UI之間的同步。即:

  1. DI_Tick把電子眼數據存儲tagReads[]存儲到非同步隊列中

  2. 新建一個線程輪蠢孝鬧詢非同步隊列,如果有數據則使用MethodInvoker跨線程綁定UI,之後從隊列移除這部分數據。

你現在的代碼,電子眼收聽函數DI_Tick是運行在UI線程的,這就造成了一旦UI線程忙慎仔碌,則你的電子眼收聽就阻塞了,所以需要使用一個非同步隊列,把UI的更新和電子眼的帶罩數據接收兩部分工作隔離開來。

2. c#(wince)跨線程同時訪問多個控制項怎麼弄啊網上給的例子都只有一個textbox,當同時很多的時侯怎麼弄。

界面卡的芹納原因是UI線程一直在給textbox賦蔽攜值,因為this.invoke方法把給textbox賦值的代碼從新開的線程放到UI線程上執行。讓新線程休眠一下應該能解決界面卡的問題。
while(true)
{
n++;

test();

Thread.Sleep(200); /宏首伏/循環一次則新線程休眠0.2秒

}

3. C++ MFC跨線程調用控制項會出問題嗎

線程調用函數是可以的.
不過需要注意,跨線程調用的函數中,如果使用了全局變數或者靜態局部變數, 或者動態申請的資源.
或者在該函數調用的函數中使用了這類資源
那麼會出現線程不安全現象,需要加鎖.

4. c# 跨線程訪問控制項

用委託,具體代碼如下~:
public delegate void MyInvoke(string str);

private void button9_Click(object sender, EventArgs e)
{
//_myInvoke = new MyInvoke(SetText);
// = false;
Thread t = new Thread(new ThreadStart(fun));
t.Start();
}

private void fun()
{
//_myInvoke("dddd");
SetText("ddd");
}
private void SetText(string s)
{
if (textBox6.InvokeRequired)
{
MyInvoke _myInvoke = new MyInvoke(SetText);
this.Invoke(_myInvoke, new object[] { s });
}
else
{
this.textBox6.Text = s;
}
}

5. winform 如何跨線程訪問

//第一步:定義一個委託
publicdelegatevoidMyInvoke(boolchecked);

privatevoidbutton_Click(objectsender,EventArgse)
{
//第二步:啟動一個後台線程
Threadt=newThread(newThreadStart(fun));
t.IsBackground=true;
t.Start();
}
//這個是後台線程函數
privatevoidfun()
{
//SetChecked方法從後台線程訪問窗體
SetChecked(false);
}

privatevoidSetChecked(boolchecked)
{
//第三步:檢測是否需要跨線程調用
if(checkbox.InvokeRequired)
{
//需要跨線程
納茄//第四步:利用委託和Invoke方法實現跨線程調用
明並MyInvoke_myInvoke=newMyInvoke(SetChecked);
this.Invoke(_myInvoke,newobject[]{checked});
}
else
{
//不需要跨線程
//直接存取、修改窗體控制項
洞槐察this.checkbox.Checked=checked;
}
}

6. c#如何跨線程調用窗體控制項

要從其他跨線程存取調用控制項,可採用以下兩種方法之一:

方法1)不進行線程安全的檢查

方法2)通過委託的方式

代碼如下所示

publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
//方法1:不進行跨線程安全檢查
//System.Windows.Forms.Control.=false;
}

privatevoidbutton1_Click(objectsender,EventArgse)
{
Threadth1=newThread(newThreadStart(CalNum));
th1.Start();
}

privatevoidCalNum()
{
//button1.Enabled=false;

intresult=0;
for(inti=1;i<100000000;i++)
{
result+=i;
}

SetCalResult(result);

//button1.Enabled=true;
}

//方法2:檢查是否跨線程,然後將方法加入委託,調用委託
(intresult);
privatevoidSetCalResult(intresult)
{
if(label2.InvokeRequired==true)
{
SetTextHandlerset=newSetTextHandler(SetCalResult);//委託的方法參數應和SetCalResult一致
label2.Invoke(set,newobject[]{result});//此方法第二參數用於傳入方法,代替形參result
}
else
{
label2.Text=result.ToString();
}
}
}
熱點內容
androidaes加密 發布:2025-02-13 05:08:36 瀏覽:492
李宗瑞文件夾 發布:2025-02-13 04:27:59 瀏覽:611
phpparent的parent 發布:2025-02-13 04:18:08 瀏覽:457
小容量存儲器市場 發布:2025-02-13 04:01:11 瀏覽:373
ickeck文件夾 發布:2025-02-13 04:00:21 瀏覽:644
上傳照片文案 發布:2025-02-13 03:53:13 瀏覽:426
電腦版花雨庭怎麼調中文伺服器 發布:2025-02-13 03:32:35 瀏覽:39
linux開發android 發布:2025-02-13 03:32:34 瀏覽:490
查詢重復欄位的sql語句 發布:2025-02-13 03:12:42 瀏覽:327
8uftp上傳網站 發布:2025-02-13 03:01:57 瀏覽:245