c控制項跨線程訪問
1. C# 跨線程調用窗體控制項
Read()函數性能太低了,阻塞了電子眼觸發函數,你需要轉變下思路,使用非同步隊列來處理電子眼數據與UI之間的同步。即:
DI_Tick把電子眼數據存儲tagReads[]存儲到非同步隊列中
新建一個線程輪蠢孝鬧詢非同步隊列,如果有數據則使用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();
}
}
}