![]() |
1
5
不,您不想在这里使用锁。这不是线程同步问题。这是一个方法重入问题。 你可以试试这个。
|
![]() |
2
2
您只需要同步(锁定是最简单的方式)代码位:
|
![]() |
3
1
最好的方法是使用Try/Finally块
只有从多个线程调用此方法时才需要真正的线程锁。考虑到它似乎是一个画图事件处理程序,这是不太可能的,因为控件被附加到一个线程上。 |
![]() |
4
1
我错过什么了吗?您发布的代码似乎没有任何作用。也就是说,无论代码是否运行
通常,任何试图像这样“锁定”自身的代码…
…非常好,只要您处于单线程场景中。如果您运行的是多线程代码,那么可能会出现问题,因为您假设没有两个线程能够到达
多线程代码中的解决方案是使用某种形式的原子开关。我已经用过了
|
![]() |
5
1
请注意,如果您的paint回调具有可重入性,则会遇到更严重的问题。油漆处理程序应该阻塞您的消息泵(并且应该相对快速地完成),所以您不应该看到这种情况。唯一的例外是,如果您从画图处理程序的某个地方调用application.doEvents(),那么您实际上不应该这样做。 |
![]() |
6
0
你把不同的名字放在中间,所以我假设你想要:
这里的问题是,如果可以从多个线程调用dataDisplayView_paint,那么
|
![]() |
7
0
如果使用monitor.tryenter,则可以指定超时,在这种情况下,您得到的结果如下:
如果您不提供超时,或将超时设置为0,则此调用不会阻塞,并将立即返回(可能更适合您的要求?):
或者,您可以
第二种方法不会对后续调用进行排队,但有可能两个线程都会命中1并评估继续进行是安全的,然后都会运行dosometing,尽管这是非常不可能的。 |
![]() |
8
0
您的问题没有足够的信息,因此我不得不对您的代码进行假设。
考虑到这一点,这里是您的代码版本,它保证我们只运行
GUI线程一次只处理一条消息,而
让我们假设
本质上,您所要做的就是在dosomething运行时禁用事件处理程序,然后重新启用它。不使用bool,而是根据需要取消挂起并重新挂起事件处理程序:
|
![]() |
a a · 为什么在这个可重入锁示例中需要引用计数? 3 年前 |
![]() |
JohnLBevan · 为什么原子语句上需要锁提示? 7 年前 |
![]() |
Jay Wang · 生产者/消费者实施:陷入消费者循环 7 年前 |
![]() |
Andremoniy · 悲观写入是否锁定整个表? 7 年前 |
![]() |
Marcus Cemes · 选择。。。用于更新在提交后选择旧数据 7 年前 |
![]() |
Ins0maniac · Rails,锁定数据库中的记录 7 年前 |