C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[12319] Re:[질문] 한쪽 쓰레드가 돌다 가 멈추는 경우가 자꾸 생깁니다.
[] 953 읽음    2001-11-05 09:05
안녕하세요.
쓰레드는 Sleep이나 우선순위랑은 상관없이 제대로 돌아야 정상인데요.. ^^;
쓰레드 실행부분(UpdateDisplay)이 쫌 복잡해서 원인이 뭔지는 정확히 모르겠지만..
혹시 화면 Update가 안되는것을 쓰레드가 안 돌고 있다고 판단 하신건 아닌가 합니다.

어쨌든..
소스에서 ..

UpdateDisplay사용할때 Synchronize함수를 전혀 안 쓰렸는데.
쓰레드 안에서 화면 처리하는 함수에는 Synchronize함수를 꼭 쓰셔야 합니다.
이걸 안쓰면 어디서 문제가 터질지 모르니까요.
이런 부분을 정확히 고쳐놓고 그 다음에 버그가 있다면 잡는게 순서입니다.

그리고 구조가 쫌 걸리는부분인데요.
while(!Terminated) 이 루틴이 Execute부분에도 있고
UpdateDisplay부분에도 똑같은 무한루프가 있으니 뭔가 찜찜한 구석이 있네요.
쓰레드 처리할때 이런식의 구조는 문제가 있어 보입니다. ( 개인적인 경험상.. )

모터 구동 부분이 들어있으니 프로젝트 보내주셔도 컴파일이 안될테고..
흠.... 암튼 빨리 해결되길 빕니다.



0:
: //head 에서는 이렇게 선언했습니다.
: class Tthread_A : public TThread
: {
:     public:
:         __fastcall Tthread_A(bool flag);
:     private:
:         void __fastcall Execute(void);
:         void __fastcall UpdateDisplay(void);
: };
: class Tthread_B : public TThread
: {
:     public:
:         __fastcall Tthread_B(bool flag);
:     private:
:         void __fastcall Execute(void);
:         void __fastcall UpdateDisplay(void);
: };
: //이건 cpp 화일입니다.
: //---------------------------------------------------------------------------
: #include <vcl.h>
: #pragma hdrstop
:
: #include "Unit4.h"
: #include "Util.h"
: #include <stdio.h>
: #include <dos.h>
: #include <time.h>
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma link "TFlatPanelUnit"
: #pragma resource "*.dfm"
: TForm4 *Form4;
: static int f_remain_count, f_temp_count, s_remain_count, s_temp_count, f_save_count, s_save_count;
: int pause_value, stop_value;
: char filename1[100], filename2[100], filename3[100], filename4[100];
: char savefile1[100000][100], savefile2[100000][100], savefile3[100000][100], savefile4[100000][100];
: int thread_a_run, thread_b_run;
: FILE *fp1, *fp2, *fp3, *fp4;
: //---------------------------------------------------------------------------
: __fastcall Tthread_A::Tthread_A(bool flag) : TThread(TRUE)
: {
:     FreeOnTerminate = true;
:     Priority = tpNormal;  //우선 순위를 안정해도 별관계는 없더군요.
:     Resume();
: }
: //---------------------------------------------------------------------------
: __fastcall Tthread_B::Tthread_B(bool flag) : TThread(TRUE)
: {
:     FreeOnTerminate = true;
:     Priority = tpLower;  //우선 순위를 안정해도 별관계는 없더군요.
:     Resume();
: }
: //---------------------------------------------------------------------------
: void __fastcall Tthread_A::Execute()
: {
:     while(!Terminated) {
:         UpdateDisplay();
:     }
: }
: //---------------------------------------------------------------------------
: void __fastcall Tthread_B::Execute()
: {
:     while(!Terminated) {
:         UpdateDisplay();
:     }
: }
: //---------------------------------------------------------------------------
: void __fastcall Tthread_A::UpdateDisplay()
: {
:     int check, check1, pos_check, count, error = 0, timeout = 0;
:     double spd = 0, spd_sum = 0, spd_avr = 0;
:     double cur = 0, cur_sum = 0, cur_avr = 0;
:     char temp[300];
:     int cw_time, cw_rest_time, ccw_time, ccw_rest_time, total_count;
:     int first_brake, first_accel;
:     time_t begintime, endtime;
:
:     first_brake  = Form4->first_brake;
:     first_accel  = Form4->first_accel;
:
:     cw_time = Form4->cw_sec;
:     if(first_brake && first_accel)
:         cw_rest_time = Form4->cw_rest - cw_time;
:     else
:         cw_rest_time = Form4->cw_rest;
:     ccw_time = Form4->ccw_sec;
:     if(first_brake && first_accel)
:         ccw_rest_time = Form4->ccw_rest - ccw_time;
:     else
:         ccw_rest_time = Form4->ccw_rest;
:     total_count = Form4->t_cycle;
:     Form4->total_1->Caption = total_count;
:
:     while(!Terminated) {
:         thread_a_run = 1;
:         if(pause_value || stop_value) break;
:         if(first_brake && first_accel) {
:             pos_check = 0;
:             pos_check = Work_Check(5, PORT_0, BRAKE1_HOME);
:             if(!pos_check) {
:                 error = 1;
:                 break;
:             }
:             BRAKE1_CYL_2_UPDOWN(UP);
:             BRAKE1_CYL_1_UPDOWN(DOWN);
:
:             check = Work_Check(DUR, PORT_1, BRAKE1_UPPER_2);
:             check1 = Work_Check(DUR, PORT_1, BRAKE1_LOWER_1);
:
:             //brake 1 cw test
:             if(check && check1) {
:                 spd_sum = 0, cur_sum = 0;
:                 pos_check = 0, count = 0;
:                 Power_1(1); //POWER1_BRAKE(ON);
:                 BRAKE1_CW(ON);
:                 begintime = time(NULL);
:                 while(1) {
:                     endtime = time(NULL);
:                     if(difftime(endtime, begintime) > cw_time) {
:                         if(pos_check) break;
:                     }
:                     if(!pos_check) {
:                         spd = ConvertData(4, 10);
:                         cur = ConvertData(12, 10);
:                         spd_sum += spd;
:                         cur_sum += cur;
:                         count++;
:                     }
:                     pos_check = Limit_Check(PORT_0, BRAKE1_END);
:                     if(pos_check) BRAKE1_CW(OFF);
:                     if(pause_value || stop_value) break;
:                     if(difftime(endtime, begintime) > 20) {
:                         timeout = 1;
:                         break;
:                     }
:                 }
:                 if(timeout == 1) break;
:                 if(pause_value || stop_value) break;
:                 BRAKE1_CW(OFF);
:                 POWER1_BRAKE(OFF);
:                 spd_avr = spd_sum / count;
:                 cur_avr = cur_sum / count;
:                 sprintf(temp,"%d   cw : load : %1.0f spd : %1.2f cur : %      1.2f",f_temp_count+1,cycle_spec[0], spd_avr, cur_avr);
:                 sprintf(savefile1[f_save_count],"%d,cw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",f_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
:                 fprintf(fp1,"%s",savefile1[f_save_count]);
:                 Form4->Memo1->Lines->Add(temp);
:                 //accel 1 cw test
:                 pos_check = 0;
:                 pos_check = Work_Check(5, PORT_0, ACCEL1_HOME);
:                 if(!pos_check) {
:                     error = 4;
:                     break;
:                 }
:                 ACCEL1_CYL_2_UPDOWN(UP);
:                 ACCEL1_CYL_1_UPDOWN(DOWN);
:
:                 check = Work_Check(DUR, PORT_0, ACCEL1_UPPER_2);
:                 check1 = Work_Check(DUR, PORT_0, ACCEL1_LOWER_1);
:
:                 if(check && check1) {
:                     spd_sum = 0, cur_sum = 0;
:                     pos_check = 0, count = 0;
:                     Power_1(2); //POWER1_ACCEL(ON);
:                     BRAKE1_CCW(ON);
:                     begintime = time(NULL);
:                     while(1) {
:                         endtime = time(NULL);
:                         if(difftime(endtime, begintime) > cw_time) {
:                             if(pos_check) break;
:                         }
:                         if(!pos_check) {
:                             spd = ConvertData(1, 10);
:                             cur = ConvertData(12, 10);
:                             spd_sum += spd;
:                             cur_sum += cur;
:                             count++;
:                         }
:                         pos_check = Limit_Check(PORT_0, ACCEL1_END);
:                         if(pos_check) BRAKE1_CCW(OFF);
:                         if(pause_value || stop_value) break;
:                         if(difftime(endtime, begintime) > 20) {
:                             timeout = 3;
:                             break;
:                         }
:                     }
:                     if(timeout == 3) break;
:                     if(pause_value || stop_value) break;
:                     BRAKE1_CCW(OFF);
:                     POWER1_ACCEL(OFF);
:                     spd_avr = spd_sum / count;
:                     cur_avr = cur_sum / count;
:                     sprintf(temp,"%d   cw : load : %1.0f spd : %1.2f cur : %1.2f",f_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
:                     sprintf(savefile2[f_save_count],"%d,cw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",f_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
:                     fprintf(fp2,"%s",savefile2[f_save_count]);
:                     Form4->Memo2->Lines->Add(temp);
:                     begintime = time(NULL);
:                     while(1) {
:                         endtime = time(NULL);
:                         if(difftime(endtime, begintime) > cw_rest_time) {
:                             break;
:                         }
:                         Form4->pnl_1->Caption = difftime(endtime, begintime);
:                         if(pause_value || stop_value) break;
:                     }
:                     if(pause_value || stop_value) break;
:                     //brake 1 ccw test
:                     pos_check = 0;
:                     pos_check = Work_Check(5, PORT_0, BRAKE1_END);
:                     if(!pos_check) {
:                         error = 7;
:                         break;
:                     }
:                     BRAKE1_CYL_1_UPDOWN(UP);
:                     BRAKE1_CYL_2_UPDOWN(DOWN);
:
:                     check = Work_Check(DUR, PORT_1, BRAKE1_UPPER_1);
:                     check1 = Work_Check(DUR, PORT_1, BRAKE1_LOWER_2);
:
:                     if(check && check1) {
:                         spd_sum = 0, cur_sum = 0;
:                         pos_check = 0, count = 0;
:                         Power_1(1); //POWER1_BRAKE(ON);
:                         BRAKE1_CCW(ON);
:                         begintime = time(NULL);
:                         while(1) {
:                             endtime = time(NULL);
:                             if(difftime(endtime, begintime) > ccw_time) {
:                                 if(pos_check) break;
:                             }
:                             if(!pos_check) {
:                                 spd = ConvertData(4, 10);
:                                 cur = ConvertData(12, 10);
:                                 spd_sum += spd;
:                                 cur_sum += cur;
:                                 count++;
:                             }
:                             pos_check = Limit_Check(PORT_0, BRAKE1_HOME);
:                             if(pos_check) BRAKE1_CCW(OFF);
:                             if(pause_value || stop_value) break;
:                             if(difftime(endtime, begintime) > 20) {
:                                 timeout = 2;
:                                 break;
:                             }
:                         }
:                         if(timeout == 2) break;
:                         if(pause_value || stop_value) break;
:                         BRAKE1_CCW(OFF);
:                         POWER1_BRAKE(OFF);
:                         spd_avr = spd_sum / count;
:                         cur_avr = cur_sum / count;
:                         sprintf(temp,"%d ccw : load : %1.0f spd : %1.2f cur : %1.2f",f_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
:                         sprintf(savefile1[++f_save_count],"%d,ccw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",f_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
:                         fprintf(fp1,"%s",savefile1[f_save_count]);
:                         Form4->Memo1->Lines->Add(temp);
:                         //accel 1 ccw test
:                         pos_check = 0;
:                         pos_check = Work_Check(5, PORT_0, ACCEL1_END);
:                         if(!pos_check) {
:                             error = 10;
:                             break;
:                         }
:                         ACCEL1_CYL_1_UPDOWN(UP);
:                         ACCEL1_CYL_2_UPDOWN(DOWN);
:
:                         check = Work_Check(DUR, PORT_0, ACCEL1_UPPER_1);
:                         check1 = Work_Check(DUR, PORT_0, ACCEL1_LOWER_2);
:
:                         if(check && check1) {
:                             pos_check = 0, count = 0;
:                             spd_sum = 0, cur_sum = 0;
:                             Power_1(2); //POWER1_ACCEL(ON);
:                             BRAKE1_CW(ON);
:                             begintime = time(NULL);
:                             while(1) {
:                                 endtime = time(NULL);
:                                 if(difftime(endtime, begintime) > Form4->cw_sec) {
:                                     if(pos_check) break;
:                                 }
:                                 if(!pos_check) {
:                                     spd = ConvertData(1, 10);
:                                     cur = ConvertData(12, 10);
:                                     spd_sum += spd;
:                                     cur_sum += cur;
:                                     count++;
:                                 }
:                                 pos_check = Limit_Check(PORT_0, ACCEL1_HOME);
:                                 if(pos_check) BRAKE1_CW(OFF);
:                                 if(pause_value || stop_value) break;
:                                 if(difftime(endtime, begintime) > 20) {
:                                     timeout = 4;
:                                     break;
:                                 }
:                             }
:                             if(timeout == 4) break;
:                             if(pause_value || stop_value) break;
:                             BRAKE1_CW(OFF);
:                             POWER1_ACCEL(OFF);
:                             spd_avr = spd_sum / count;
:                             cur_avr = cur_sum / count;
:                             sprintf(temp,"%d ccw : load : %1.0f spd : %1.2f cur : %1.2f",f_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
:                             sprintf(savefile2[f_save_count],"%d,ccw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",f_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
:                             fprintf(fp2,"%s",savefile2[f_save_count]);
:                             Form4->Memo2->Lines->Add(temp);
:                             begintime = time(NULL);
:                             while(1) {
:                                 endtime = time(NULL);
:                                 if(difftime(endtime, begintime) > ccw_rest_time) {
:                                     break;
:                                 }
:                                 Form4->pnl_1->Caption = difftime(endtime, begintime);
:                                 if(pause_value || stop_value) break;
:                             }
:                             if(pause_value || stop_value) break;
:                             f_remain_count = total_count - (++f_temp_count);
:                             Form4->remain_1->Caption = f_remain_count;
:                             if(f_remain_count > 0) {
:                                 f_save_count++; // 여기가 쓰레드 A 의 완료 시점입니다.
:                             }                   // 여기가 false 이면 쓰레드 A 를 빠져나갑니다
:                             else break;
:                         }
:                         else {
:                             if(!check) error = 11;
:                             if(!check1) error = 12;
:                             break;
:                         }
:                     }
:                     else {
:                         if(!check)  error = 8;
:                         if(!check1) error = 9;
:                         break;
:                     }
:                 }
:                 else {
:                     if(!check)  error = 5;
:                     if(!check1) error = 6;
:                     break;
:                 }
:             }
:             else {
:                 if(!check)  error = 2;
:                 if(!check1) error = 3;
:                 break;
:             }
:         }
:         Sleep(250);  //여기서 delay 를 주었습니다.
:     }
:
:     BRAKE1_CW(OFF);
:     BRAKE1_CCW(OFF);
:     POWER1_BRAKE(OFF);
:     POWER1_ACCEL(OFF);
:
:     while(!Terminated) Terminate();
:     if(!error && !timeout && !f_remain_count) {
:         Terminate();
:         if(!pause_value && !stop_value) {
:             thread_a_run = 0;
:             Init_Cyl(1);
:             Form4->FileSave_A();
:             Form4->thread_exit_check();
:         }
:     }
:     else {
:         BuzzerOnOff();
:
:             if(error == 1)  Application->MessageBoxA("BRAKE1_HOME POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
:             if(error == 2)  Application->MessageBoxA("BRAKE1_CYL_2_UPPER POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
:             if(error == 3)  Application->MessageBoxA("BRAKE1_CYL_1_LOWER POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
:             if(error == 4)  Application->MessageBoxA("ACCEL1_HOME POSITION ERROR","Accel 1",MB_OK|MB_ICONERROR);
:             if(error == 5)  Application->MessageBoxA("ACCEL1_CYL_2_UPPER POSITION ERROR","Accel 1",MB_OK|MB_ICONERROR);
:             if(error == 6)  Application->MessageBoxA("ACCEL1_CYL_1_LOWER POSITION ERROR","Accel 1",MB_OK|MB_ICONERROR);
:             if(error == 7)  Application->MessageBoxA("BRAKE1_END POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
:             if(error == 8)  Application->MessageBoxA("BRAKE1_CYL_1_UPPER POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
:             if(error == 9)  Application->MessageBoxA("BRAKE1_CYL_2_LOWER POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
:             if(error == 10) Application->MessageBoxA("ACCEL1_END POSITION ERROR","Brake 1",MB_OK|MB_ICONERROR);
:             if(error == 11) Application->MessageBoxA("ACCEL1_CYL_1_UPPER POSITION ERROR","Accel 1",MB_OK|MB_ICONERROR);
:             if(error == 12) Application->MessageBoxA("ACCEL1_CYL_2_LOWER POSITION ERROR","Accel 1",MB_OK|MB_ICONERROR);
:             if(timeout == 1) Application->MessageBoxA("BRAKE1_END POSITION SEARCH ERROR","Brake 1",MB_OK|MB_ICONERROR);
:             if(timeout == 2) Application->MessageBoxA("BRAKE1_HOME POSITION SEARCH ERROR","Brake 1",MB_OK|MB_ICONERROR);
:             if(timeout == 3) Application->MessageBoxA("ACCEL1_END POSITION SEARCH ERROR","Accel 1",MB_OK|MB_ICONERROR);
:             if(timeout == 4) Application->MessageBoxA("ACCEL1_HOME POSITION SEARCH ERROR","Accel 1",MB_OK|MB_ICONERROR);
:
:             Form4->resume_btn->Enabled = true;
:     }
: }
: //------------------------------------------------------------------------------------------------
: void __fastcall Tthread_B::UpdateDisplay()
: {
:     int check, check1, pos_check, count, error = 0, timeout = 0;
:     double spd = 0, spd_sum = 0, spd_avr = 0;
:     double cur = 0, cur_sum = 0, cur_avr = 0;
:     char temp[300];
:     int cw_time, cw_rest_time, ccw_time, ccw_rest_time, total_count;
:     int second_brake, second_accel;
:     time_t begintime, endtime;
:
:     second_brake  = Form4->second_brake;
:     second_accel  = Form4->second_accel;
:
:     cw_time = Form4->cw_sec;
:     if(second_brake && second_accel)
:         cw_rest_time = Form4->cw_rest - cw_time;
:     else
:         cw_rest_time = Form4->cw_rest;
:     ccw_time = Form4->ccw_sec;
:     if(second_brake && second_accel)
:         ccw_rest_time = Form4->ccw_rest - ccw_time;
:     else
:         ccw_rest_time = Form4->ccw_rest;
:     total_count = Form4->t_cycle;
:     Form4->total_2->Caption = total_count;
:
:
:     while(!Terminated) {
:         thread_b_run = 1;
:         if(pause_value || stop_value) break;
:         if(second_brake && second_accel) {
:             pos_check = 0;
:             pos_check = Work_Check(5, PORT_2, BRAKE2_HOME);
:             if(!pos_check) {
:                 error = 1;
:                 break;
:             }
:             BRAKE2_CYL_2_UPDOWN(UP);
:             BRAKE2_CYL_1_UPDOWN(DOWN);
:
:             check = Work_Check(DUR, PORT_3, BRAKE2_UPPER_2);
:             check1 = Work_Check(DUR, PORT_3, BRAKE2_LOWER_1);
:
:             //brake 2 cw test
:             if(check && check1) {
:                 spd_sum = 0, cur_sum = 0;
:                 pos_check = 0, count = 0;
:                 Power_2(1); //POWER2_BRAKE(ON);
:                 BRAKE2_CW(ON);
:                 begintime = time(NULL);
:                 while(1) {
:                     endtime = time(NULL);
:                     if(difftime(endtime, begintime) > cw_time) {
:                         if(pos_check) break;
:                     }
:                     if(!pos_check) {
:                         spd = ConvertData(10, 10);
:                         cur = ConvertData(13, 10);
:                         spd_sum += spd;
:                         cur_sum += cur;
:                         count++;
:                     }
:                     pos_check = Limit_Check(PORT_2, BRAKE2_END);
:                     if(pos_check) BRAKE2_CW(OFF);
:                     if(pause_value || stop_value) break;
:                     if(difftime(endtime, begintime) > 20) {
:                         timeout = 1;
:                         break;
:                     }
:                 }
:                 if(timeout == 1) break;
:                 if(pause_value || stop_value) break;
:                 BRAKE2_CW(OFF);
:                 POWER2_BRAKE(OFF);
:                 spd_avr = spd_sum / count;
:                 cur_avr = cur_sum / count;
:                 sprintf(temp,"%d   cw : load : %1.0f spd : %1.2f cur : %1.2f",s_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
:                 sprintf(savefile3[s_save_count],"%d,cw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",s_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
:                 fprintf(fp3,"%s",savefile3[s_save_count]);
:                 Form4->Memo3->Lines->Add(temp);
:                 //accel 2 cw test
:                 pos_check = 0;
:                 pos_check = Work_Check(5, PORT_2, ACCEL2_HOME);
:                 if(!pos_check) {
:                     error = 4;
:                     break;
:                 }
:                 ACCEL2_CYL_2_UPDOWN(UP);
:                 ACCEL2_CYL_1_UPDOWN(DOWN);
:
:                 check = Work_Check(DUR, PORT_2, ACCEL2_UPPER_2);
:                 check1 = Work_Check(DUR, PORT_2, ACCEL2_LOWER_1);
:
:                 if(check && check1) {
:                     spd_sum = 0, cur_sum = 0;
:                     pos_check = 0, count = 0;
:                     Power_2(2); //POWER2_ACCEL(ON);
:                     BRAKE2_CCW(ON);
:                     begintime = time(NULL);
:                     while(1) {
:                         endtime = time(NULL);
:                         if(difftime(endtime, begintime) > cw_time) {
:                             if(pos_check) break;
:                         }
:                         if(!pos_check) {
:                             spd = ConvertData(7, 10);
:                             cur = ConvertData(13, 10);
:                             spd_sum += spd;
:                             cur_sum += cur;
:                             count++;
:                         }
:                         pos_check = Limit_Check(PORT_2, ACCEL2_END);
:                         if(pos_check) BRAKE2_CCW(OFF);
:                         if(pause_value || stop_value) break;
:                         if(difftime(endtime, begintime) > 20) {
:                             timeout = 3;
:                             break;
:                         }
:                     }
:                     if(timeout == 3) break;
:                     if(pause_value || stop_value) break;
:                     BRAKE2_CCW(OFF);
:                     POWER2_ACCEL(OFF);
:                     spd_avr = spd_sum / count;
:                     cur_avr = cur_sum / count;
:                     sprintf(temp,"%d   cw : load : %1.0f spd : %1.2f cur : %1.2f",s_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
:                     sprintf(savefile4[s_save_count],"%d,cw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",s_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
:                     fprintf(fp4,"%s",savefile4[s_save_count]);
:                     Form4->Memo4->Lines->Add(temp);
:                     begintime = time(NULL);
:                     while(1) {
:                         endtime = time(NULL);
:                         if(difftime(endtime, begintime) > cw_rest_time) {
:                             break;
:                         }
:                         Form4->pnl_2->Caption = difftime(endtime, begintime);
:                         if(pause_value || stop_value) break;
:                     }
:                     if(pause_value || stop_value) break;
:                     //brake 2 ccw test
:                     pos_check = 0;
:                     pos_check = Work_Check(5, PORT_2, BRAKE2_END);
:                     if(!pos_check) {
:                         error = 7;
:                         break;
:                     }
:                     BRAKE2_CYL_1_UPDOWN(UP);
:                     BRAKE2_CYL_2_UPDOWN(DOWN);
:
:                     check = Work_Check(DUR, PORT_3, BRAKE2_UPPER_1);
:                     check1 = Work_Check(DUR, PORT_3, BRAKE2_LOWER_2);
:
:                     if(check && check1) {
:                         spd_sum = 0, cur_sum = 0;
:                         pos_check = 0, count = 0;
:                         Power_2(1); //POWER1_BRAKE(ON);
:                         BRAKE2_CCW(ON);
:                         begintime = time(NULL);
:                         while(1) {
:                             endtime = time(NULL);
:                             if(difftime(endtime, begintime) > ccw_time) {
:                                 if(pos_check) break;
:                             }
:                             if(!pos_check) {
:                                 spd = ConvertData(10, 10);
:                                 cur = ConvertData(13, 10);
:                                 spd_sum += spd;
:                                 cur_sum += cur;
:                                 count++;
:                             }
:                             pos_check = Limit_Check(PORT_2, BRAKE2_HOME);
:                             if(pos_check) BRAKE2_CCW(OFF);
:                             if(pause_value || stop_value) break;
:                             if(difftime(endtime, begintime) > 20) {
:                                 timeout = 2;
:                                 break;
:                             }
:                         }
:                         if(timeout == 2) break;
:                         if(pause_value || stop_value) break;
:                         BRAKE2_CCW(OFF);
:                         POWER2_BRAKE(OFF);
:                         spd_avr = spd_sum / count;
:                         cur_avr = cur_sum / count;
:                         sprintf(temp,"%d ccw : load : %1.0f spd : %1.2f cur : %1.2f",s_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
:                         sprintf(savefile3[++s_save_count],"%d,ccw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",s_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
:                         fprintf(fp3,"%s",savefile3[s_save_count]);
:                         Form4->Memo3->Lines->Add(temp);
:                         //accel 2 ccw test
:                         pos_check = 0;
:                         pos_check = Work_Check(5, PORT_2, ACCEL2_END);
:                         if(!pos_check) {
:                             error = 10;
:                             break;
:                         }
:                         ACCEL2_CYL_1_UPDOWN(UP);
:                         ACCEL2_CYL_2_UPDOWN(DOWN);
:
:                         check = Work_Check(DUR, PORT_2, ACCEL2_UPPER_1);
:                         check1 = Work_Check(DUR, PORT_2, ACCEL2_LOWER_2);
:
:                         if(check && check1) {
:                             pos_check = 0, count = 0;
:                             spd_sum = 0, cur_sum = 0;
:                             Power_2(2); //POWER2_ACCEL(ON);
:                             BRAKE2_CW(ON);
:                             begintime = time(NULL);
:                             while(1) {
:                                 endtime = time(NULL);
:                                 if(difftime(endtime, begintime) > Form4->cw_sec) {
:                                     if(pos_check) break;
:                                 }
:                                 if(!pos_check) {
:                                     spd = ConvertData(7, 10);
:                                     cur = ConvertData(13, 10);
:                                     spd_sum += spd;
:                                     cur_sum += cur;
:                                     count++;
:                                 }
:                                 pos_check = Limit_Check(PORT_2, ACCEL2_HOME);
:                                 if(pos_check) BRAKE2_CW(OFF);
:                                 if(pause_value || stop_value) break;
:                                 if(difftime(endtime, begintime) > 20) {
:                                     timeout = 4;
:                                     break;
:                                 }
:                             }
:                             if(timeout == 4) break;
:                             if(pause_value || stop_value) break;
:                             BRAKE2_CW(OFF);
:                             POWER2_ACCEL(OFF);
:                             spd_avr = spd_sum / count;
:                             cur_avr = cur_sum / count;
:                             sprintf(temp,"%d ccw : load : %1.0f spd : %1.2f cur : %1.2f",s_temp_count+1,cycle_spec[0],spd_avr, cur_avr);
:                             sprintf(savefile4[s_save_count],"%d,ccw,load,%1.0f,spd,%1.2f,cur,%1.2f\n",s_temp_count+1,cycle_spec[0],spd_avr,cur_avr);
:                             fprintf(fp4,"%s",savefile4[s_save_count]);
:                             Form4->Memo4->Lines->Add(temp);
:                             begintime = time(NULL);
:                             while(1) {
:                                 endtime = time(NULL);
:                                 if(difftime(endtime, begintime) > ccw_rest_time) {
:                                     break;
:                                 }
:                                 Form4->pnl_2->Caption = difftime(endtime, begintime);
:                                 if(pause_value || stop_value) break;
:                             }
:                             if(pause_value || stop_value) break;
:                             s_remain_count = total_count - (++s_temp_count);
:                             Form4->remain_2->Caption = s_remain_count;
:                             if(s_remain_count > 0) {  // 여기가 쓰레드 B 의 완료 시점입니다.
:                                 s_save_count++;       // 여기가 false 이면 쓰레드 B 를 빠져나갑니다.
:                             }
:                             else break;
:                         }
:                         else {
:                             if(!check) error = 11;
:                             if(!check1) error = 12;
:                             break;
:                         }
:                     }
:                     else {
:                         if(!check)  error = 8;
:                         if(!check1) error = 9;
:                         break;
:                     }
:                 }
:                 else {
:                     if(!check)  error = 5;
:                     if(!check1) error = 6;
:                     break;
:                 }
:             }
:             else {
:                 if(!check)  error = 2;
:                 if(!check1) error = 3;
:                 break;
:             }
:         }
:     }
:
:     BRAKE2_CW(OFF);
:     BRAKE2_CCW(OFF);
:     POWER2_BRAKE(OFF);
:     POWER2_ACCEL(OFF);
:
:     while(!Terminated) Terminate();
:     if(!error && !timeout && !s_remain_count) {
:         Terminate();
:         if(!pause_value && !stop_value) {
:             thread_b_run = 0;
:             Init_Cyl(2);
:             Form4->FileSave_B();
:             Form4->thread_exit_check();
:         }
:     }
:     else {
:             BuzzerOnOff();
:
:             if(error == 1)  Application->MessageBoxA("BRAKE2_HOME POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
:             if(error == 2)  Application->MessageBoxA("BRAKE2_CYL_2_UPPER POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
:             if(error == 3)  Application->MessageBoxA("BRAKE2_CYL_1_LOWER POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
:             if(error == 4)  Application->MessageBoxA("ACCEL2_HOME POSITION ERROR","Accel 2",MB_OK|MB_ICONERROR);
:             if(error == 5)  Application->MessageBoxA("ACCEL2_CYL_2_UPPER POSITION ERROR","Accel 2",MB_OK|MB_ICONERROR);
:             if(error == 6)  Application->MessageBoxA("ACCEL2_CYL_1_LOWER POSITION ERROR","Accel 2",MB_OK|MB_ICONERROR);
:             if(error == 7)  Application->MessageBoxA("BRAKE2_END POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
:             if(error == 8)  Application->MessageBoxA("BRAKE2_CYL_1_UPPER POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
:             if(error == 9)  Application->MessageBoxA("BRAKE2_CYL_2_LOWER POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
:             if(error == 10) Application->MessageBoxA("ACCEL2_END POSITION ERROR","Brake 2",MB_OK|MB_ICONERROR);
:             if(error == 11) Application->MessageBoxA("ACCEL2_CYL_1_UPPER POSITION ERROR","Accel 2",MB_OK|MB_ICONERROR);
:             if(error == 12) Application->MessageBoxA("ACCEL2_CYL_2_LOWER POSITION ERROR","Accel 2",MB_OK|MB_ICONERROR);
:             if(timeout == 1) Application->MessageBoxA("BRAKE2_END POSITION SEARCH ERROR","Brake 2",MB_OK|MB_ICONERROR);
:             if(timeout == 2) Application->MessageBoxA("BRAKE2_HOME POSITION SEARCH ERROR","Brake 2",MB_OK|MB_ICONERROR);
:             if(timeout == 3) Application->MessageBoxA("ACCEL2_END POSITION SEARCH ERROR","Accel 2",MB_OK|MB_ICONERROR);
:             if(timeout == 4) Application->MessageBoxA("ACCEL2_HOME POSITION SEARCH ERROR","Accel 2",MB_OK|MB_ICONERROR);
:             Form4->resume_btn->Enabled = true;
:     }
: }
:
:

+ -

관련 글 리스트
12314 [질문] 한쪽 쓰레드가 돌다 가 멈추는 경우가 자꾸 생깁니다. fbpsok 850 2001/11/04
12319     Re:[질문] 한쪽 쓰레드가 돌다 가 멈추는 경우가 자꾸 생깁니다. 953 2001/11/05
12323         Re:Re:[질문] 한쪽 쓰레드가 돌다 가 멈추는 경우가 자꾸 생깁니다. hongfox(붉은여우) 861 2001/11/05
12326             Re:Re:Re:[질문] 한쪽 쓰레드가 돌다 가 멈추는 경우가 자꾸 생깁니다. 886 2001/11/05
12321         Re:Re:[질문] 한쪽 쓰레드가 돌다 가 멈추는 경우가 자꾸 생깁니다. 792 2001/11/05
12324             Re:Re:Re:[질문] 한쪽 쓰레드가 돌다 가 멈추는 경우가 자꾸 생깁니다. 884 2001/11/05
12325                 Re:Re:Re:Re:[질문] 한쪽 쓰레드가 돌다 가 멈추는 경우가 자꾸 생깁니다. 840 2001/11/05
12327                     Re:Re:Re:Re:Re:[질문] 한쪽 쓰레드가 돌다 가 멈추는 경우가 자꾸 생깁니다. 846 2001/11/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.