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

c跨線程訪問控制項

發布時間: 2022-10-04 00:17:22

⑴ C#如何在線程中訪問控制項對象

利用ListView.Invoke解決跨線程安全調用,關鍵代碼如下:

voidFindFileInDir(){
if(listView2.InvokeRequired)
{
//跨線程調用
listView2.Invoke(newMethodInvoker(delegate
{
listView2.Items.Add(path);
}));
}
else
{
//直接調用
listView2.Items.Add(path);
}
}//EndofFindFileInDir

⑵ 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();
}
}
}

⑶ C#窗體程序中,為什麼有時候直接跨線程使用控制項也不會報錯

直接跨線程使用控制項 那是非線程安全,最好不用,盡量用委託吧

⑷ 虛心求教c#在其他類中跨線程調用form中的控制項,如何實現呢

不建議在類中直接訪問控制項,這不符合低耦合的設計要求,有些正式項目維護很麻煩的,特別是跨線程。

下面用我自己的一個掃描槍項目舉例

1、在你的業務類中定義事件委託,將要處理的參數通過事件傳遞給事件函數(如果你傳遞的數據較多,需要另外定義一個特定參數類,使用屬性定義包含你要傳遞的數據)。

(objectSender,stringtext);//定義掃描事件的委託
;//定義掃描事件對象,該對象用於外部程序掛接事件響應函數
//定義一個發送事件的函數
(stringtext)
{
if(OnStartScanning!=null)
OnStartScanning(_Sender,text);//_Sender是調用該對象時傳入的發生源,即某文本框控制項,此處傳回給事件處理(響應)函數,其中text為掃描到的並經過業務對象檢查後的文本(條碼)
}

2、在你的業務類中需要操作控制項地方,通過事件發送函數觸發事件,將參數發送給事件函數處理。

下面在窗口代碼中定義

3、為事件響應函數定義一個非同步委託,該委託由事件響應函數調用,實現跨線程訪問窗口控制項

private delegate void OnThreadStart(object sender);

4、實例化業務對象,定義一個為該對象服務的,處理窗口控制項的事件響應函數。

=newScanningGunMonitor();
privatevoidProctScanMonitor_OnStartScanning(objectsender,stringText)
{
//這里是重點,自定義類對象的事件觸發會導致與窗口不在一個線程,通過下面的代碼進行非同步訪問重新訪問自己
if(InvokeRequired)
{
OnThreadStartmydelgate=newOnThreadStart(ProctScanMonitor_OnStartScanning);
//非同步的委託
this.Invoke(mydelgate,newobject[]{sender,Text});
return;
}

//窗口線程可執行的代碼
TextBoxbox=(TextBox)sender;
box.Text=Text;
box.Select(box.TextLength,0);
}

5、在初始化的地方為該對象添加定義的事件響應函數,業務對象觸發事件時會調用它。

ProctScanMonitor.OnStartScanning+=newScanningGunMonitor.StartScanning(ProctScanMonitor_OnStartScanning);//添加事件響應

⑸ 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;
}
}

⑹ c# 跨線程訪問控制項

我最近剛好在弄多線程採集,用委託解決

(stringtest);
publicvoidSetDtText(stringtext)
{
if(list_dt.InvokeRequired)
{
CjDbCallBackd=newCjDbCallBack(SetDtText);
this.Invoke(d,newobject[]{text});
}
else
{
list_dt.Items.Insert(0,text);
}
}

list_dt控制項名

然後到處用就行了

⑺ C#跨線程調用控制項,怎麼用invoke返回值

獲取控制項的值需要用invoke方法嗎?需要的話就用委託吧,不需要的話就直接獲取控制項的值

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

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

⑼ c#中如何跨線程調用windows控制項

在輔助線程調用(在創建輔助線程時可將此方法通過delegate傳到輔助線程中)下面的方法InvokeControl();

//寫在主線程中(windows控制項)
private void InvokeControl()
{
if (this.InvokeRequired)
this.Invoke(new DelegateChangeText(ChangeText));
else
this.ChangeText();
}

private void ChangeText()
{
this.TextBox.Text = "sd";
}

public delegate void DelegateChangeText();

熱點內容
4k無壓縮 發布:2025-05-15 06:02:54 瀏覽:74
hp存儲6350 發布:2025-05-15 05:40:41 瀏覽:233
怎麼更改電腦默認緩存位置 發布:2025-05-15 05:39:01 瀏覽:877
安卓qq公孫離在哪個戰區戰力最低 發布:2025-05-15 05:38:58 瀏覽:493
androidffmpeg壓縮 發布:2025-05-15 05:37:02 瀏覽:288
ftp簡稱是 發布:2025-05-15 05:37:02 瀏覽:121
光遇發光耳機怎麼設置安卓 發布:2025-05-15 05:32:03 瀏覽:113
台電安卓平板系統太低怎麼辦 發布:2025-05-15 05:20:00 瀏覽:510
安裝了zlib編譯報錯 發布:2025-05-15 05:19:56 瀏覽:168
二分演算法無序 發布:2025-05-15 05:18:22 瀏覽:30