⑴ C# c/s 從不是創建控制項「listBox1」的線程訪問它。
public Form1( )
{
InitializeComponent ( );
Form1. = false;
}
⑵ C#如何在線程中訪問控制項對象
利用ListView.Invoke解決跨線程安全調用,關鍵代碼如下:
voidFindFileInDir(){
if(listView2.InvokeRequired)
{
//跨線程調用
listView2.Invoke(newMethodInvoker(delegate
{
listView2.Items.Add(path);
}));
}
else
{
//直接調用
listView2.Items.Add(path);
}
}//EndofFindFileInDir
⑶ C#多線程如何調用主線程創建的控制項
1.新開的線程是無法直接訪問UI控制項的,如果需要訪問,可以通過控制項的Invoke方法,或者用
System.Threading.SynchronizationContext.Current.Post方法
2.一定不要在控制項的內部事件處理方法裡面使用Sleep等線程暫停方法!
像我這樣寫就不會阻塞了:
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread thread = new System.Threading.Thread(() =>
{
while (true)
{
this.Invoke(new Action(() =>
{
label1.Text = (count++).ToString();
}));
System.Threading.Thread.Sleep(100);
}
});
thread.IsBackground = true;
thread.Start();
}
你把setmess這個線程方法Invoke到了UI的主線程上了,而這個線程裡面有暫停方法,所以呢主線程也會暫停卡住。
而我的方法只是把「label1.Text = (count++).ToString();」Invoke到主線程,而那個新的線程並沒有Invoke到主線程,所以在那個線程裡面使用暫停就沒事了!
假如有一個操作比較費時,或者需要等待之類的,就像我這樣開始一個新的線程,所以的等待操作,費時的操作都在在這個線程裡面做,當這些線程需要訪問UI控制項的時候,就用this.Invoke()這個方法!
⑷ c#跨線程訪問控制項,為什麼Thread對象不能寫在方法裡面
線程如果是個死循環 你想想程序會不會一直卡在某個語句不動了呢 線程雖然獨立於主UI線程 但是你啟動線程的語句在程序執行的過程中是要跳出的 否則會卡在t1.start();這一行 那樣你如何修改btn的caption
⑸ c# 跨線程訪問控制項
那你可以在停止線程代碼後再加上銷毀excel資源的代碼啊。
Microsoft.Office.Interop.Excel.Application屬於不可託管資源,不會自動釋放的。
⑹ VC 如何在線程里調用主窗口的控制項
關鍵的步驟就是獲取實際窗口指針(句柄)。
不同程序和模式獲取方式不同,一般可以通過參數傳遞、AfxGetMainWnd等MFC函數獲取、全局變數、共享內存等方式獲取,第一種最簡單,其它的各有要求。
獲取指針後GetSafeHandle可以獲取句柄,然後SendMessage即可。
⑺ C#怎麼跨線程訪問控制項
只能用委託,不推薦 = false; 這種做法。
推薦一個封裝好的 InvokeHelper 類(http://www.cnblogs.com/conmajia/archive/2012/08/05/multithread-gui-invoker.html),使用時只需要:
InvokeHelper.Invoke(<控制項名>,"<方法名稱>",<參數>);
InvokeHelper.Get(<控制項名>,"<屬性名稱>");
InvokeHelper.Set(<控制項名>,"<屬性名稱>",<屬性值>);
即可。
⑻ C# 子線程訪問主窗體控制項
是的,
在其他線程里,不允許調用主線程創建的控制項~!!!!
這樣做,是不安全的,因此,2.0屏蔽了這個~
樓上說的很對,用委託,具體代碼如下~:
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#中多線程裡面如何調用控制項
定義委託,然後用invoke
private void ucMidPartsid_Load(object sender, EventArgs e)
{
if (is_Load == true)
{
thread = new Thread(new ThreadStart(this.LoadData));
thread.Start();
}
//if (datafinish != null)
//{
// datafinish(this, e);
//}
}
private void LoadData()
{
QueryDataCallBack deleg;
deleg = new QueryDataCallBack(this.DataBinding);
this.Invoke(deleg,null);
}
private void DataBinding()
{
partstableAdapter = new GreatWall.SCM.Parts.DataAccess.DAParts.PartsTableAdapter();
partstableAdapter.Fill(dsParts.GB_PARTS);
cobMidPartsid.DataSource = dsParts.GB_PARTS;
cobMidPartsid.DisplayMember = "B_PARTSID";
cobMidPartsid.ValueMember = "B_ID";
EventArgs e = new EventArgs();
if (datafinish != null)
{
finish = true;
datafinish(this, e);
}
}
⑽ C#類線程中調用窗體控制項
應該是這里出了問題:
this.box.Items.Add(ClientNum
+
":號用戶已上線");
委託實現非同步執行的時候,使用到了不在它線程內定義的界面對象,出錯!
所以,應該改為:
this.box.Invoke(new
Action<string>(AddClient),
ClientNum.ToString());
void
AddClient(string
num)
{
his.box.Items.Add(num+
":號用戶已上線");
}