2010-07-12 2 views
0

응용 프로그램이 시작될 때 세 개의 스레드를 생성하고 이러한 스레드가 응용 프로그램 수명 동안 계속 실행되는 다중 스레드 응용 프로그램을 구축하고 있습니다. 모든 스레드는 독점적이며 어쨌든 서로 간섭하지 않습니다. 이제는 사용자가 응용 프로그램을 일시 중단 할 수 있습니다. 여기서 스레드를 일시 중단하거나 말하려합니다.멀티 스레드 응용 프로그램에 대한 개선 된 접근 방법 제안

현재 전경 스레드로 스레드를 생성하고 있지만 백그라운드 스레드로 변경하면 어쨌든 내 응용 프로그램에 영향을 미치지 않을 것입니다. (끝내기 전까지는 포 그라운드 스레드가 응용 프로그램을 유지할 것입니다.)

저는 여기에 사람들에게 thread.suspend() 또는 thread.abort()를 통해 응용 프로그램을 일시 중단하는 방법을 제안 할 것을 요청합니다. 나는 thread.suspend가 쓸모없고 위험하다는 것을 알고 있지만, 어떤 유형의 동기화도 사용하지 않고있는 곳에서도 내 애플리케이션에 해로울 수 있습니다.

추신 : 내 스레드가 매분마다 내장 데이터베이스 (sqlite)에서 데이터를 저장하고 &에 검색 중입니다.

답변

1

뮤텍스를 생성하고 스레드가 해당 뮤텍스에 대한 신호를 기다리게 할 수 있습니다. 이렇게하면 쓰레드가 파괴되지는 않지만 자원을 거의 소비하지 않고도 거의 자게됩니다.

Mutex.WaitOne

+0

응용 프로그램을 사용하는 동안 대부분의 시간 동안 컴퓨터가 잠자기 상태가 된 다음 잠에서 깨어 나면 다시 잠자기 상태가됩니다. 이 프로세스는 응용 프로그램이 일시적으로 일시 중단되거나 영구적으로 로그 아웃 될 때까지 계속됩니다. 그러나 사용자가 응용 프로그램을 일시 중단 또는 로그 아웃하면 즉시 스레드를 종료하고 싶습니다. 뮤텍스 (Mutex)를 사용하거나 핸들을 기다려서이 작업을 수행 할 수 있다고 생각하십니까? 그렇다면,이 멀티 스레딩 작업을 시작한 이래로 정교함 (단지 겸손한 요청)을 부탁해주십시오. 감사합니다. – madcap

+0

아니요, 가능하지 않지만 실제로 스레드를 _destroy_해야합니까, 아니면 단지 스레드가 처리를 중단하고 싶습니까? 대답은 대개 스레드에 필요한 리소스 (즉, 큰 개체를 메모리에 유지)에 따라 달라집니다. – dbemerlin

+0

글쎄, 사용자가 일시 중지 된 다음 스레드가 다시 실행되기를 원할 때 스레드가 일시적으로 일시 중지되기를 원합니다. 사용자는 내 스레드를 중단하려는 응용 프로그램에서 로그 아웃 할 수도 있습니다. 내가 현재하고있는 것은 두 경우 모두 스레드를 중단한다는 것입니다. – madcap

2

사용 WaitHandles 같은 차단 메커니즘 (으로 ManualResetEvent, AutoResetEvent), 모니터, 세마포어 등 ...

앤드류

P.S. 질문은 매우 광범위하므로 동기화가 포함 된 멀티 스레딩의 검증 된 프랙티스와 원칙에 대한 궁극적 인 읽기를 권합니다. 귀하의 요구 사항이 너무 복잡해 보이지 않으므로 귀하의 필요에 맞는 최상의 방법을 연구 할 수있을 것이라고 확신합니다.

+0

가 핸들을 즉시 중지하거나 스레드를 중단하는 데 사용할 수 기다릴 수있다? 또한 중요한 영역이나 동기화를 사용하지 않기 때문에 스레드를 즉시 중단하면 어떤 문제가있을 수 있는지 이해하지 못합니다. – madcap

0

사실,이 상황은 Thread.Suspend 메이크업 감각을하는 유일한 하나입니다. 쓸모없는 이유는 사람들을 오용하여 동기화를 위조하거나 자신이 소유하지 않은 스레드 (예 : ThreadPool 스레드)에서 사용하기 때문입니다.

+0

나는 같은 느낌. 환호! – madcap

1

난 항상 이것에 대한으로 ManualResetEvent를 사용

class Myclass 
{ 
    ManualResetEvent _event; 
    Thread _thread; 

    public void Start() 
    { 
     _thread = new Thread(WorkerThread); 
     _thread.IsBackground = true; 
     _thread.Start(); 
    } 

    public void Stop() 
    { 
     _event.Set(); 
     if (!_thread.Join(5000)) 
      _thread.Abort(); 
    } 

    private void WorkerThread() 
    { 
     while (true) 
     { 
      // wait 5 seconds, change to whatever you like 
      if (_event.WaitOne(5000)) 
       break; // signalled to stop 

      //do something else here 
     } 
    } 
} 
관련 문제