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
[12314] [질문] 한쪽 쓰레드가 돌다 가 멈추는 경우가 자꾸 생깁니다.
fbpsok [] 849 읽음    2001-11-04 18:18
A 쓰레드는 Sleep(250) 을 해주었고 B 쓰레드는 해주지 않았습니다.
그리고 쓰레드 생성시 우선순위를 정해주었는데...
이렇게 정해주는게 정해주지 않는것보다는 오래 동작하더군요.
가령 안 정해주고 하면 한 10 번쯤 쓰레드가 while 문을 돌때쯤이면 한쪽은 중지 되 있는 상태입니다.
그러나 우선순위를 정해주니까 이것보다는 오래 동작하다가 한쪽 쓰레드가 중지되더군요.
그리고 이것도 해보았는데 마찬가지 더군요.
지금 프로그램은 한쓰레드안에서 만약 총 테스트 횟수가 100 회라면
그 쓰레드를 한번만 생성하고 while 문안에서 100 회를 도는데
다르게 100 회를 하는데 쓰레드 한번만 생성한게 아니고
아예 한번만 동작하고 빠져나오고 하는식으로 100 개의 쓰레드를 생성시켜 보았는데도 마찬가지더군요.
제발 읽어 보시고 도움을 좀 부탁드립니다.
이거 안되면 큰일 나는데...
계속 해보았는데 딱히 방법을 모르겠습니다.
이 프로 그램의 용도는 자동차용 모터의 내구성을 시험하는것인데
모터 A , 모터 B 를 정해진 횟수만큼 돌려서 다 돌린후 모터의 성능을 알아보는것입니다.
그래서 모터 A 를 쓰레드 A 를 생성한후 돌아가게 했고
마찬가지로 모터 B 를 쓰레드 B 를 생성한후 돌아가게 했습니다.
그리고 프로그램에서 A 쓰레드는 마지막에 Sleep(250) 을 두었고
B 쓰레드는 해주지 않았는데 이것도 하나 안하나 멈추는것 마찬가지였습니다.
몇번 질문을 올렸는데 가르쳐 주신 방법으로 해봤는데 잘 안되는군요.

어느쪽이든 한 쓰레드는 한 3번정도 가면 동작을 안하고 멈춰있습니다.
나머지 한쪽은 끝까지 동작합니다.
3번이 아니라 2번째, 1번째 그럴때도 있고.
아예 한번도 동작을 안할때 가 있습니다.
그러니까 아래와 같이 해주면 A, B 가 동작을 해야 하는데

//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 849 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.