C#多线程中WaitOne函数的问题,请指教!

C#多线程中WaitOne函数的问题,请指教!,第1张

官方有代码,有说明,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 函数。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12158290.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存