프로젝트

일반

사용자정보

통계
| 개정판:

hytos / ID2.Manager / ID2.Manager.Compare / CustomSynchronizationContext.cs @ 416979ec

이력 | 보기 | 이력해설 | 다운로드 (2.57 KB)

1
using System;
2
using System.ComponentModel;
3
using System.Runtime.InteropServices;
4
using System.Security;
5
using System.Threading;
6
using System.Windows.Forms;
7

    
8
/// <summary>
9
/// This class helps to avoid some synchornization issues between WinForms UI and Eyeshot parallel execution. More details here: https://stackoverflow.com/questions/35535580/why-does-parallel-for-execute-the-winforms-message-pump-and-how-to-prevent-it
10
/// The problem (huge delay) was reproducible switching between two tabs of the EyeshotDemo that build a BRep (for example Bracket and Flange) and moving the mouse cursor very fast on the control surface just after tab switch.
11
/// A similar problem (flickering) was present in the MarchingCubes sample.
12
/// </summary>
13
public class CustomSynchronizationContext : SynchronizationContext
14
{
15
    public static void Install()
16
    {
17
        var currentContext = Current;
18
        if (currentContext is CustomSynchronizationContext) return;
19
        WindowsFormsSynchronizationContext.AutoInstall = false;
20
        SetSynchronizationContext(new CustomSynchronizationContext(currentContext));
21
    }
22

    
23
    public static void Uninstall()
24
    {
25
        var currentContext = Current as CustomSynchronizationContext;
26
        if (currentContext == null) return;
27
        SetSynchronizationContext(currentContext.baseContext);
28
    }
29

    
30
    private WindowsFormsSynchronizationContext baseContext;
31

    
32
    private CustomSynchronizationContext(SynchronizationContext currentContext)
33
    {
34
        baseContext = currentContext as WindowsFormsSynchronizationContext  ?? new WindowsFormsSynchronizationContext();
35
        SetWaitNotificationRequired();
36
    }
37

    
38
    public override SynchronizationContext CreateCopy() { return this; }
39
    public override void Post(SendOrPostCallback d, object state) { baseContext.Post(d, state); }
40
    public override void Send(SendOrPostCallback d, object state) { baseContext.Send(d, state); }
41
    public override void OperationStarted() { baseContext.OperationStarted(); }
42
    public override void OperationCompleted() { baseContext.OperationCompleted(); }
43

    
44
    public override int Wait(IntPtr[] waitHandles, bool waitAll, int millisecondsTimeout)
45
    {
46
        int result = WaitForMultipleObjectsEx(waitHandles.Length, waitHandles, waitAll, millisecondsTimeout, false);
47
        if (result == -1) throw new Win32Exception();
48
        return result;
49
    }
50

    
51
    [SuppressUnmanagedCodeSecurity]
52
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
53
    private static extern int WaitForMultipleObjectsEx(int nCount, IntPtr[] pHandles, bool bWaitAll, int dwMilliseconds, bool bAlertable);
54
}
클립보드 이미지 추가 (최대 크기: 500 MB)