2012-08-24 2 views
3

저는 VS2010을 가지고 있으며 Windows 양식 응용 프로그램에서 작업하고 있습니다.vb.net에서 waitHandle을 사용하는 방법

그래서 (사용자 입력에 따라) 동적으로 생성 된 스레드가 있습니다.이 스레드의 처리는 잠시 (극단적 인 경우에는 며칠) 걸릴 수 있습니다. 그래서 폼에 버튼을 놓았고 스레드를 '일시 중지'또는 '일시 중단'할 수 있기를 원합니다. 나는 .suspend 메서드를 찾았으며 대체되었습니다. (사용하려고 시도했지만 가끔 실패합니다 - UI 충돌로 인해)이 작업을 수행하는 새로운 방법은 'waithandle'입니다. 나는 이것에 대한 문서를 읽고 그것을 사용하는 방법을 해결할 수 없습니다.

이 각 스레드의 기본 구조는 다음과 같습니다

Do 
    'time consuming operations 
loop 'a number of times 

그런 다음 별도의 버튼에서 나는 일시 정지 코드를 삽입하고 싶습니다. 모든 것이 빠르다는 것이 중요하지는 않습니다. 루프를 통해 다음 실행을 일시 중지하는 것이 좋습니다 (각 실행은 아주 빠르며, 수 백 번 반복합니다). 루프 시작 부분에 waithandle 검사를해야한다고 가정하고 있지만 이것을 구현하는 방법을 실제로 알지 못합니다.

Dim waitHandles As System.Threading.EventWaitHandle = New System.Threading.AutoResetEvent(True) 

모든 스레드 (기본 UI 스레드 제외) 한 번에 일시 중지 할 수 있습니다 그래서 나는 그것이 내가 하나의 대기 핸들을 필요로하지만, 이것에 대해 확실하지 않다 의미한다고 생각이 내 WaitHandle이 희미 코드입니다.

어쨌든 누구나 코드가 do 루프에 들어가고 일시 중지 버튼으로 들어가면 다른 모든 것들을 처리 할 수 ​​있다고 생각하면됩니다. :)

많은 감사!

프레이저

댓글에서

:

감사합니다! 나는 그것을 작동 시켰어. 여기 내도 구현의 :

Dim mre As New System.Threading.ManualResetEvent(True) 

(그건 그냥 '공용 클래스 양식 1'아래에있는 코드 (상단에 있어요) 다음에 그것을 스레딩은이 : 일시 정지 버튼에 마지막으로

mre.WaitOne(), 

/일시 중지가 해제 스레드가 있습니다

mre.Reset() 'to resume the threads and, mre.Set() 'to pause the threads 

답변

1

이 대한으로 ManualResetEvent를 사용 AutoResetEvent는 '거의 세마포어'는 점에서 당신이 스레드를 가지고만큼 그것을 신호를해야 할 것입니다. 기다리는 중입니다. 상황에 따라 어색해질 수 있습니다.

이벤트가 발생하면 (즉, 설정 됨) 신호를 생성하고 대기 상태로 시스템 호출이 스레드의 루프에 미치는 영향이 적은 적절한 지점에서 스레드에서 기다립니다. 어쩌면 가장 안쪽 루프에 있지 않을 수도 있습니다.

'일시 중지'버튼에서 이벤트 지우기 OnClick(), 'Resume'OnClick()에서 설정하십시오.

미안 해요, 난 어떤 VB가없는, 그러나 할 :)

+0

감사를 쉽게해야합니다 왜냐하면 실제 코드 '! 나는 그것을 작동 시켰어. 여기 내 implimentation : Dim mre As New System.Threading.ManualResetEvent (True) (코드 'public class form 1'바로 아래) 스레딩에서 다음과 같습니다. mre.mre.Reset() (사람이 편집 할 수 있다면이 그것을 만드는 : 스레드를 일시 정지 '), mre.Set을 (스레드를 재개하는'WaitOne()는 마지막 일시 정지 버튼에 /는이 스레드를 일시 중지가 해제 좀 더 깔끔하고, 난 그냥 방법을 모르는이 다른 사람에게 도움이 될 것 같아요!) – FraserOfSmeg

관련 문제