|
hongfox입니다.
thread_A를 실행시키고 Windows NT의 TaskManager레서 해당 thread_A가
CPU점유율이 얼마나 되는지 확인 해 보세요....
만일 CPU점유율이 100%를 차지 한다면
function UpdateDisplay() 에서 While()문을 쓰고 있다면
While()문 안에서 Sleep(250)정도를 주면은 두게 모두 동작할 겁니다.
이것은 thread_A가 다른 thread_B에게 CPU의 사용 할당을 넘겨주지를 못하게하여
발생되는 현상 입니다.
thread에서 200개의 Thread를 생성하고 무리없이 동작될려면 제의 경험상 평균 적으로
While()문에서 Sleep(250)을 주면 무리없이 프로세스의 CPU점유율이 많이 떨어 집니다.
많은 도움 되시기를.......
fbpsok 님이 쓰신 글 :
: 빌더 5.0 standard 버전을 사용하고 있습니다.
: 그런더 쓰레드를 사용하여 프로그램을 실행하니 자꾸 가만히 멈춰있는 경우가 생깁니다.
: 쓰레드 2 개를 생성하여 각각의 두 쓰레드는 다른 동작을 합니다.
:
: 쓰레드 생성은
: Thread_A * thread_A = new Thread_A(true);
: Thread_B * thread_B = new Thread_B(true);
:
: 이렇게 해주었고 Execute() 부분에서 Synchronize 처리안하고 그냥 생성했습니다.
: 2쓰레드가 동시에 동작해야 하니까(물론 어느정도 딜레이 는 괜찮음)
: __fastcall Tthread_A::Tthread_A(bool flag) : TThread(TRUE)
: {
: FreeOnTerminate = true;
: Resume();
: }
: //---------------------------------------------------------------------------
: void __fastcall Tthread_A::Execute()
: {
: while(!Terminated) {
: UpdateDisplay();
: }
: }
: //--------------------------
: __fastcall Tthread_B::Tthread_B(bool flag) : TThread(TRUE)
: {
: FreeOnTerminate = true;
: Resume();
: }
: //---------------------------------------------------------------------------
: void __fastcall Tthread_B::Execute()
: {
: while(!Terminated) {
: UpdateDisplay();
: }
: }
: //--------------------------
: 그리고 쓰레드가 하는일은 모터의 특성을 검사하는데...
: 모터를 앞, 뒤로 회전시키는것을 A, B 쓰레드가 100 번씩 해야한다고 가정하면(물론 제품은 별개)
: 어느쪽이든 한 쓰레드는 한 3번정도 가면 동작을 안하고 멈춰있습니다.
: 나머지 한쪽은 끝까지 동작합니다.
: 3번이 아니라 2번째, 1번째 그럴때도 있고.
: 아예 한번도 동작을 안할때 가 있습니다.
: 그러니까 아래와 같이 해주면 A, B 가 동작을 해야 하는데
:
: Thread_A * thread_A;
: Thread_B * thread_B;
:
: thread_A = new Thread_A(true);
: thread_B = new Thread_B(true);
:
: 둘중 하나는 아예 동작을 안하고 멈춰있을때도 있습니다.
: 그리고 쓰레드 안에서 시간을 계산하기 위해 difftime 을 쓰고 있습니다.
:
:
|