官方有代码,有说明,MSDN,有例子,为什么不看呢
using System;
using SystemThreading;
namespace testmono
{
class WaitOne
{
static AutoResetEvent autoEvent = new AutoResetEvent (false);
static void Main ()
{
ConsoleWriteLine ("Main starting");
ThreadPoolQueueUserWorkItem (new WaitCallback (WorkMethod), autoEvent);
// Wait for work method to signal
if (autoEventWaitOne (1000, false)) {
ConsoleWriteLine ("Work method signaled");
} else {
ConsoleWriteLine ("Timed out waiting for work " + "method to signal");
}
ConsoleWriteLine ("Main ending");
}
static void WorkMethod (object stateInfo)
{
ConsoleWriteLine ("Work starting");
// Simulate time spent working
ThreadSleep (new Random ()Next (100, 2000));
// Signal that work is finished
ConsoleWriteLine ("Work ending");
((AutoResetEvent)stateInfo)Set ();
}
}
你修改autoEventWaitOne (1000, false))
这个你就明白了,
是这样子的呀,因为listBox1是Form1这个线程创建的,当然不能让其他的线程访问了。如果需要被其他的线程访问的化,需要使用委托。
举个例子:
//
先定义一个委托
public
delegate
void
SetTextCallback(string
text);
//
单击按钮
private
void
button1_Click(object
sender,
EventArgs
e)
{
Thread
t
=
new
Thread(new
ThreadStart(fun1));
tStart();
}
//
线程函数体
private
void
fun1()
{
setText("hello");
}
//
设置文本函数
private
void
setText(string
text)
{
if
(label1InvokeRequired)
{
SetTextCallback
s
=
new
SetTextCallback(setText);
Invoke(s,
new
string[]
{
text
});
}
else
{
label1Text
=
text;
}
}
窗体其实是窗体类的一个实例,当类实例了一个对象后,就相当与创建了一个线程,所以不能直接用其他的线程访问内部成员。
连分都没有还要求改代码,太过分了,你要嫌麻烦,就在构造函数里面加一句:
public
Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls
=
false;
}
MSDN对CheckForIllegalCrossThreadCalls的解释:获取或设置一个值,该值指示是否捕获对错误线程的调用,这些调用在调试应用程序时访问控件的
Handle
属性。
如果试图访问控件的方法或属性之一的线程不是创建该控件的线程,则通常会导致不可预知的结果。通常,无效的线程活动是对访问控件的
Handle
属性的错误线程的调用。将
CheckForIllegalCrossThreadCalls
设置为
true
可以在调试时更容易查找并诊断此线程活动。请注意在调试器外部启动应用程序时,非法跨线程调用将始终引发异常。
C语言中没有名为" Lodsetcursor"的标准库函数。我猜您可能是指 Windows API 中的 SetCursor 函数。
SetCursor 函数是用于设置当前鼠标光标的形状。它接受一个 HCURSOR 类型的参数,该参数指定要设置的光标形状。如果函数成功,它将返回先前的光标句柄;否则,它将返回空(NULL)。
例如,以下代码将设置当前的鼠标光标为 IDC_WAIT 形状(即等待光标),并保存先前的光标句柄以便以后恢复:
```
HCURSOR hPrevCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
// 在这里执行需要一段时间的 *** 作
SetCursor(hPrevCursor); // 恢复先前的光标形状
```
请注意,SetCursor 函数只会影响当前线程的光标形状。如果您需要在全局范围内更改光标形状,您需要使用 SetSystemCursor 函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)