Ik heb een applicatie geschreven die communiceert met electrische verschroefmachines via ethernet.
De applicatie leest een barcode in met een scanner, die op een seriele poort zit en stuurt wat gegevens naar de verschroefmachine.
Ik krijg zo nu een dan een deadlock (geen cpu gebruik, UI werkt niet meer) en ctrl+alt+del is de enige oplossing. Ik gebruik 1 lock statement. Dit is als de port data stuurt om deze te verwerken. Alleen de poort zelf kan hierop moeten wachten (stel je zo 2x te snel scanneer en de vorige data is nog niet verwerkt)
Ik heb met DebugDiag een dump gemaakt de stack van de hoofdthread zit er zo uit:
en van de andere thread met een stack (de rest heeft geen stack en doet dus niets)
ziet er zo uit:
Dit zijn alle functie die niet door mij zijn gemaakt. Ik wil eigenlijk wel weten waarom de UI thread hierop wacht, ik dacht dat de seriele poort alles async deed, wat de oorzaak is en hoe ik dit op kan lossen.
Er zijn thoerieen die melden dat het apparaat van de poort halen die probleem kan veroorzaken, maar ik kan dit niet herproduceren.
ik heb hier wel wat zitten lezen. Ik betwijfel ook of het de seriele poort is, maar niet iets anders.
Ik heb zonet nog een crash voor mijn kiezen gekregen en de stack zit er hetzelfde uit.
Wat doet de OnUserPreferenceChanged in SystemEvents?
Ggole doet wonderen : info
De applicatie leest een barcode in met een scanner, die op een seriele poort zit en stuurt wat gegevens naar de verschroefmachine.
Ik krijg zo nu een dan een deadlock (geen cpu gebruik, UI werkt niet meer) en ctrl+alt+del is de enige oplossing. Ik gebruik 1 lock statement. Dit is als de port data stuurt om deze te verwerken. Alleen de poort zelf kan hierop moeten wachten (stel je zo 2x te snel scanneer en de vorige data is nog niet verwerkt)
Ik heb met DebugDiag een dump gemaakt de stack van de hoofdthread zit er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| OS Thread Id: 0xba0 (0) ESP EIP 0012eee8 7c90e514 [HelperMethodFrame_1OBJ: 0012eee8] System.Threading.WaitHandle.WaitOneNative(Microsoft.Win32.SafeHandles.SafeWaitHandle, UInt32, Boolean, Boolean) 0012ef94 792b68af System.Threading.WaitHandle.WaitOne(Int64, Boolean) 0012efb0 792b6865 System.Threading.WaitHandle.WaitOne(Int32, Boolean) 0012efc4 7b6f1a4f System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle) 0012efd8 7ba2d68b System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean) 0012f078 7b6f33ac System.Windows.Forms.Control.Invoke(System.Delegate, System.Object[]) 0012f0ac 7b920bd7 System.Windows.Forms.WindowsFormsSynchronizationContext.Send(System.Threading.SendOrPostCallback, System.Object) 0012f0c4 7a924362 Microsoft.Win32.SystemEvents+SystemEventInvokeInfo.Invoke(Boolean, System.Object[]) 0012f0f8 7a922a93 Microsoft.Win32.SystemEvents.RaiseEvent(Boolean, System.Object, System.Object[]) 0012f144 7a923f8f Microsoft.Win32.SystemEvents.OnUserPreferenceChanged(Int32, IntPtr, IntPtr) 0012f164 7aa8f594 Microsoft.Win32.SystemEvents.WindowProc(IntPtr, Int32, IntPtr, IntPtr) 0012f168 003520a4 [InlinedCallFrame: 0012f168] 0012f32c 7b1d8d2e System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32, Int32, Int32) 0012f3c8 7b1d8997 System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext) 0012f41c 7b1d87e1 System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext) 0012f44c 7b195931 System.Windows.Forms.Application.Run(System.Windows.Forms.Form) 0012f460 00d0021f DcTools.Main.Program.Main() 0012f69c 79e71b4c [GCFrame: 0012f69c] |
en van de andere thread met een stack (de rest heeft geen stack en doet dus niets)
ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
| OS Thread Id: 0xe34 (13) ESP EIP 04a5f51c 7c90e514 [HelperMethodFrame_1OBJ: 04a5f51c] System.Threading.WaitHandle.WaitOneNative(Microsoft.Win32.SafeHandles.SafeWaitHandle, UInt32, Boolean, Boolean) 04a5f5c8 792b68af System.Threading.WaitHandle.WaitOne(Int64, Boolean) 04a5f5e4 792b6865 System.Threading.WaitHandle.WaitOne(Int32, Boolean) 04a5f5f8 792b682d System.Threading.WaitHandle.WaitOne() 04a5f600 7a9f5ddd System.IO.Ports.SerialStream+EventLoopRunner.WaitForCommEvent() 04a5f640 792d6d66 System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 04a5f64c 792e01ef System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 04a5f664 792d6ce4 System.Threading.ThreadHelper.ThreadStart() 04a5f88c 79e71b4c [GCFrame: 04a5f88c] |
Dit zijn alle functie die niet door mij zijn gemaakt. Ik wil eigenlijk wel weten waarom de UI thread hierop wacht, ik dacht dat de seriele poort alles async deed, wat de oorzaak is en hoe ik dit op kan lossen.
Er zijn thoerieen die melden dat het apparaat van de poort halen die probleem kan veroorzaken, maar ik kan dit niet herproduceren.
ik heb hier wel wat zitten lezen. Ik betwijfel ook of het de seriele poort is, maar niet iets anders.
Ik heb zonet nog een crash voor mijn kiezen gekregen en de stack zit er hetzelfde uit.
Wat doet de OnUserPreferenceChanged in SystemEvents?
Ggole doet wonderen : info
if broken it is, fix it you should