Q&A

  • 쓰레드와 타이머 사용시 타이머 동작하지 않는 경우[무지급함]
안녕하세요.



제가 쓰레드와 타이머를 사용해서 db에 ado로 연결하는 동안 연결 시간을 타이머를

이용하여 표시를 해주는 건데요.



문제는 연결하는 동안 먹통이 되다가 연결 되면 그때서에 타이머가 동작을 하더라구요



그래서 검색해서 알려주신 몇가지를 사용을 해봤는데.. 그것으로도 해결이 안되더라구요



첫번째로 제가 쓰래드 안에 application.ProcessMessages; 을 사용하였는데도 먹통이였구요



그리고 excute 안에 Synchronize를 사용하여 따로 함수를 불러서 했는데도 마찬가지로



먹통 되다가 연결되면 그때서야 타이머가 작동하더라구요. 이거 어떻게 해야할지



모르겠군요. 제가 소스 올려 드릴테니 꼭 해결해주세요 부탁입니다. ^^







TAdoconn = class(TThread) //쓰레드 생성

private

FADoConn : TADOConnection;

procedure ConnectString;

protected

procedure Execute; override;

public

constructor Create(Adoconn : TADOConnection); virtual;

end;



var

newThread : TAdoconn;



implementation



uses uMain , uAdo;

{$R *.dfm}



//쓰레드 생성 하여 작업을 할수 있도록 동시 작업을 하도록 한다.



procedure TAdoconn.Execute;

begin

application.ProcessMessages;

Synchronize(ConnectString);

end;



procedure TAdoconn.ConnectString;

begin

try



fAdoconn.ConnectionString := '연결부분 여기는 생략'

fadoconn.Connected := true;

except

fadoconn.Close;

end;

end;





constructor TAdoconn.Create(ADOconn : TADOConnection);

begin

inherited create(true);

FADoConn := AdoConn;

FreeOnTerminate := true;

Resume;

end;



//쓰레드 생성 과정 끝





이렇게 했는데요 타이머를 작동을 시키면서 쓰레드를 생성했는데.

먹통이 되더라구요.. 꼭 부탁드립니다.



Ctime.Enabled := true;

newThread := Tadoconn.Create(ado.AdoC);

newThread.FreeOnTerminate := true;

newthread.Resume;

4  COMMENTS
  • Profile
    srookie 2001.12.03 04:57
    김대웅 wrote:

    > 안녕하세요.

    >

    > 제가 쓰레드와 타이머를 사용해서 db에 ado로 연결하는 동안 연결 시간을 타이머를

    > 이용하여 표시를 해주는 건데요.

    >

    > 문제는 연결하는 동안 먹통이 되다가 연결 되면 그때서에 타이머가 동작을 하더라구요

    >

    > 그래서 검색해서 알려주신 몇가지를 사용을 해봤는데.. 그것으로도 해결이 안되더라구요

    >

    > 첫번째로 제가 쓰래드 안에 application.ProcessMessages; 을 사용하였는데도 먹통이였구요

    >

    > 그리고 excute 안에 Synchronize를 사용하여 따로 함수를 불러서 했는데도 마찬가지로

    >

    > 먹통 되다가 연결되면 그때서야 타이머가 작동하더라구요. 이거 어떻게 해야할지

    >

    > 모르겠군요. 제가 소스 올려 드릴테니 꼭 해결해주세요 부탁입니다. ^^

    >

    >

    >

    > TAdoconn = class(TThread) //쓰레드 생성

    > private

    > FADoConn : TADOConnection;

    > procedure ConnectString;

    > protected

    > procedure Execute; override;

    > public

    > constructor Create(Adoconn : TADOConnection); virtual;

    > end;

    >

    > var

    > newThread : TAdoconn;

    >

    > implementation

    >

    > uses uMain , uAdo;

    > {$R *.dfm}

    >

    > //쓰레드 생성 하여 작업을 할수 있도록 동시 작업을 하도록 한다.

    >

    > procedure TAdoconn.Execute;

    > begin

    > application.ProcessMessages;

    > Synchronize(ConnectString);

    > end;

    >

    > procedure TAdoconn.ConnectString;

    > begin

    > try

    >

    > fAdoconn.ConnectionString := '연결부분 여기는 생략'

    > fadoconn.Connected := true;

    > except

    > fadoconn.Close;

    > end;

    > end;

    >

    >

    > constructor TAdoconn.Create(ADOconn : TADOConnection);

    > begin

    > inherited create(true);

    > FADoConn := AdoConn;

    > FreeOnTerminate := true;

    > Resume;

    > end;

    >

    > //쓰레드 생성 과정 끝

    >

    >

    > 이렇게 했는데요 타이머를 작동을 시키면서 쓰레드를 생성했는데.

    > 먹통이 되더라구요.. 꼭 부탁드립니다.

    >

    > Ctime.Enabled := true;

    > newThread := Tadoconn.Create(ado.AdoC);

    > newThread.FreeOnTerminate := true;

    > newthread.Resume;



    안녕하세요.

    Thread쪽의 Execute쪽에 문제가 있는것 같습니다.

    일단 Thread가 계속 살아 있기 위해서는 Application.ProcessMessage를 계속 수행해야 할 텐데 그게 없네요.

    그래서, Thread쪽에서 Application.Processmessage를 한 번 호출 한 후에 제거 되었을 겁니다.

    while TRUE do

    begin

    application.ProcessMessages;

    Synchronize(ConnectString);

    end;



    이런 식으로 Execute문을 바꿔 보시길...

  • Profile
    동급최강바보 2001.12.03 20:02
    우선 하나씩 얘기를 할께여.

    쓰레드를 생성할때(Create)에서 마지막에 Resume을 했는데 타이머 이벤트에서 굳이 다시 Resume을 할필요가 있는지.

    Create에서 Resume을 할 필요없이 inherited create(false) 이러게 하면 바로 실행될텐데.

    아니면 Create에서 Resume을 빼시던지요.



    그 다음으로 While문으로 무한 루프를 돌릴때 안에다 꼭 Sleep을 써주셔야 합니다.

    저도 이유는 정확하게 모르지만 연습삼아 while문으로 무한루프를 돌리고 CPU점유율을 한번 보세여. 아마 점유율이 90%가 넘어갈껍니다.

    근데 신기하게도 While문 내에 Sleep을 해주면 신기하게도 떨어지더라구여.

    저도 정확하게 왜 그런지는 이해하지 못해서. 왜 그런지는 정확하게 말씀을.. ㅡㅡa

    지성.



    아무튼 허접한 답변이라서 지성합니다.











    srookie wrote:

    > 김대웅 wrote:

    > > 안녕하세요.

    > >

    > > 제가 쓰레드와 타이머를 사용해서 db에 ado로 연결하는 동안 연결 시간을 타이머를

    > > 이용하여 표시를 해주는 건데요.

    > >

    > > 문제는 연결하는 동안 먹통이 되다가 연결 되면 그때서에 타이머가 동작을 하더라구요

    > >

    > > 그래서 검색해서 알려주신 몇가지를 사용을 해봤는데.. 그것으로도 해결이 안되더라구요

    > >

    > > 첫번째로 제가 쓰래드 안에 application.ProcessMessages; 을 사용하였는데도 먹통이였구요

    > >

    > > 그리고 excute 안에 Synchronize를 사용하여 따로 함수를 불러서 했는데도 마찬가지로

    > >

    > > 먹통 되다가 연결되면 그때서야 타이머가 작동하더라구요. 이거 어떻게 해야할지

    > >

    > > 모르겠군요. 제가 소스 올려 드릴테니 꼭 해결해주세요 부탁입니다. ^^

    > >

    > >

    > >

    > > TAdoconn = class(TThread) //쓰레드 생성

    > > private

    > > FADoConn : TADOConnection;

    > > procedure ConnectString;

    > > protected

    > > procedure Execute; override;

    > > public

    > > constructor Create(Adoconn : TADOConnection); virtual;

    > > end;

    > >

    > > var

    > > newThread : TAdoconn;

    > >

    > > implementation

    > >

    > > uses uMain , uAdo;

    > > {$R *.dfm}

    > >

    > > //쓰레드 생성 하여 작업을 할수 있도록 동시 작업을 하도록 한다.

    > >

    > > procedure TAdoconn.Execute;

    > > begin

    > > application.ProcessMessages;

    > > Synchronize(ConnectString);

    > > end;

    > >

    > > procedure TAdoconn.ConnectString;

    > > begin

    > > try

    > >

    > > fAdoconn.ConnectionString := '연결부분 여기는 생략'

    > > fadoconn.Connected := true;

    > > except

    > > fadoconn.Close;

    > > end;

    > > end;

    > >

    > >

    > > constructor TAdoconn.Create(ADOconn : TADOConnection);

    > > begin

    > > inherited create(true);

    > > FADoConn := AdoConn;

    > > FreeOnTerminate := true;

    > > Resume;

    > > end;

    > >

    > > //쓰레드 생성 과정 끝

    > >

    > >

    > > 이렇게 했는데요 타이머를 작동을 시키면서 쓰레드를 생성했는데.

    > > 먹통이 되더라구요.. 꼭 부탁드립니다.

    > >

    > > Ctime.Enabled := true;

    > > newThread := Tadoconn.Create(ado.AdoC);

    > > newThread.FreeOnTerminate := true;

    > > newthread.Resume;

    >

    > 안녕하세요.

    > Thread쪽의 Execute쪽에 문제가 있는것 같습니다.

    > 일단 Thread가 계속 살아 있기 위해서는 Application.ProcessMessage를 계속 수행해야 할 텐데 그게 없네요.

    > 그래서, Thread쪽에서 Application.Processmessage를 한 번 호출 한 후에 제거 되었을 겁니다.

    > while TRUE do

    > begin

    > application.ProcessMessages;

    > Synchronize(ConnectString);

    > end;

    >

    > 이런 식으로 Execute문을 바꿔 보시길...

  • Profile
    srookie 2001.12.04 08:16
    제가 지난번에 Timer에서 Thread를 Resume한다는 것을 못보고서 답변을 드려서 허접한 답변이 나오고 말았네요.

    죄송합니다.

    동급최강바보 님께서 말하신 Application.ProcessMessage를 Thread내부에서 무한루프를 돌릴 경우에 CPU의 점유율은 말씀하신 것처럼 올라가지 않으니 한번 실험해보시기 바랍니다.

    그리고, 김대웅님께서 질문하신 것은 Thread 내부에 TEvent같은 동기화 객체를 선언하고 Main Thread쪽에서 Timer Event걸렸을 때 Thread내부 객체에 Event만 발생시켜주면 될것 같습니다만...

    실험해보시길...



    지난번 허접답변에 다시한번 깊이 사죄드립니당~



    동급최강바보 wrote:

    > 우선 하나씩 얘기를 할께여.

    > 쓰레드를 생성할때(Create)에서 마지막에 Resume을 했는데 타이머 이벤트에서 굳이 다시 Resume을 할필요가 있는지.

    > Create에서 Resume을 할 필요없이 inherited create(false) 이러게 하면 바로 실행될텐데.

    > 아니면 Create에서 Resume을 빼시던지요.

    >

    > 그 다음으로 While문으로 무한 루프를 돌릴때 안에다 꼭 Sleep을 써주셔야 합니다.

    > 저도 이유는 정확하게 모르지만 연습삼아 while문으로 무한루프를 돌리고 CPU점유율을 한번 보세여. 아마 점유율이 90%가 넘어갈껍니다.

    > 근데 신기하게도 While문 내에 Sleep을 해주면 신기하게도 떨어지더라구여.

    > 저도 정확하게 왜 그런지는 이해하지 못해서. 왜 그런지는 정확하게 말씀을.. ㅡㅡa

    > 지성.

    >

    > 아무튼 허접한 답변이라서 지성합니다.

    >

    >

    >

    >

    >

    > srookie wrote:

    > > 김대웅 wrote:

    > > > 안녕하세요.

    > > >

    > > > 제가 쓰레드와 타이머를 사용해서 db에 ado로 연결하는 동안 연결 시간을 타이머를

    > > > 이용하여 표시를 해주는 건데요.

    > > >

    > > > 문제는 연결하는 동안 먹통이 되다가 연결 되면 그때서에 타이머가 동작을 하더라구요

    > > >

    > > > 그래서 검색해서 알려주신 몇가지를 사용을 해봤는데.. 그것으로도 해결이 안되더라구요

    > > >

    > > > 첫번째로 제가 쓰래드 안에 application.ProcessMessages; 을 사용하였는데도 먹통이였구요

    > > >

    > > > 그리고 excute 안에 Synchronize를 사용하여 따로 함수를 불러서 했는데도 마찬가지로

    > > >

    > > > 먹통 되다가 연결되면 그때서야 타이머가 작동하더라구요. 이거 어떻게 해야할지

    > > >

    > > > 모르겠군요. 제가 소스 올려 드릴테니 꼭 해결해주세요 부탁입니다. ^^

    > > >

    > > >

    > > >

    > > > TAdoconn = class(TThread) //쓰레드 생성

    > > > private

    > > > FADoConn : TADOConnection;

    > > > procedure ConnectString;

    > > > protected

    > > > procedure Execute; override;

    > > > public

    > > > constructor Create(Adoconn : TADOConnection); virtual;

    > > > end;

    > > >

    > > > var

    > > > newThread : TAdoconn;

    > > >

    > > > implementation

    > > >

    > > > uses uMain , uAdo;

    > > > {$R *.dfm}

    > > >

    > > > //쓰레드 생성 하여 작업을 할수 있도록 동시 작업을 하도록 한다.

    > > >

    > > > procedure TAdoconn.Execute;

    > > > begin

    > > > application.ProcessMessages;

    > > > Synchronize(ConnectString);

    > > > end;

    > > >

    > > > procedure TAdoconn.ConnectString;

    > > > begin

    > > > try

    > > >

    > > > fAdoconn.ConnectionString := '연결부분 여기는 생략'

    > > > fadoconn.Connected := true;

    > > > except

    > > > fadoconn.Close;

    > > > end;

    > > > end;

    > > >

    > > >

    > > > constructor TAdoconn.Create(ADOconn : TADOConnection);

    > > > begin

    > > > inherited create(true);

    > > > FADoConn := AdoConn;

    > > > FreeOnTerminate := true;

    > > > Resume;

    > > > end;

    > > >

    > > > //쓰레드 생성 과정 끝

    > > >

    > > >

    > > > 이렇게 했는데요 타이머를 작동을 시키면서 쓰레드를 생성했는데.

    > > > 먹통이 되더라구요.. 꼭 부탁드립니다.

    > > >

    > > > Ctime.Enabled := true;

    > > > newThread := Tadoconn.Create(ado.AdoC);

    > > > newThread.FreeOnTerminate := true;

    > > > newthread.Resume;

    > >

    > > 안녕하세요.

    > > Thread쪽의 Execute쪽에 문제가 있는것 같습니다.

    > > 일단 Thread가 계속 살아 있기 위해서는 Application.ProcessMessage를 계속 수행해야 할 텐데 그게 없네요.

    > > 그래서, Thread쪽에서 Application.Processmessage를 한 번 호출 한 후에 제거 되었을 겁니다.

    > > while TRUE do

    > > begin

    > > application.ProcessMessages;

    > > Synchronize(ConnectString);

    > > end;

    > >

    > > 이런 식으로 Execute문을 바꿔 보시길...

  • Profile
    김대웅 2001.12.05 02:40
    님 알려주신데로 했는데요..



    그래도 먹통이 되네요.



    서버 쪽에 컴퓨터가 꺼져 있으면요 8초정도 프로그래스바에 표시를 해준다음에



    에러 메세지를 띄우는 것인데요.



    마찬가지로 무한 루트를 이용하여서 했는데도 먹통이 되네요. 이거 큰일이네..



    간단한 예라도 알려주시면 안될까요 정말로 깊히 부탁드립니다.



    fadoconn.Connected := true; 여기에서 서버를 끈상태에서 하면 가만히 있습니당. 디버깅 할때봤더니요



    그리고 예외 발생하고 넘어가더군요. application.processmessage를 사용해도 이러니 큰일이네.



    꼭 부탁드립니다.



    srookie wrote:

    > 제가 지난번에 Timer에서 Thread를 Resume한다는 것을 못보고서 답변을 드려서 허접한 답변이 나오고 말았네요.

    > 죄송합니다.

    > 동급최강바보 님께서 말하신 Application.ProcessMessage를 Thread내부에서 무한루프를 돌릴 경우에 CPU의 점유율은 말씀하신 것처럼 올라가지 않으니 한번 실험해보시기 바랍니다.

    > 그리고, 김대웅님께서 질문하신 것은 Thread 내부에 TEvent같은 동기화 객체를 선언하고 Main Thread쪽에서 Timer Event걸렸을 때 Thread내부 객체에 Event만 발생시켜주면 될것 같습니다만...

    > 실험해보시길...

    >

    > 지난번 허접답변에 다시한번 깊이 사죄드립니당~

    >

    > 동급최강바보 wrote:

    > > 우선 하나씩 얘기를 할께여.

    > > 쓰레드를 생성할때(Create)에서 마지막에 Resume을 했는데 타이머 이벤트에서 굳이 다시 Resume을 할필요가 있는지.

    > > Create에서 Resume을 할 필요없이 inherited create(false) 이러게 하면 바로 실행될텐데.

    > > 아니면 Create에서 Resume을 빼시던지요.

    > >

    > > 그 다음으로 While문으로 무한 루프를 돌릴때 안에다 꼭 Sleep을 써주셔야 합니다.

    > > 저도 이유는 정확하게 모르지만 연습삼아 while문으로 무한루프를 돌리고 CPU점유율을 한번 보세여. 아마 점유율이 90%가 넘어갈껍니다.

    > > 근데 신기하게도 While문 내에 Sleep을 해주면 신기하게도 떨어지더라구여.

    > > 저도 정확하게 왜 그런지는 이해하지 못해서. 왜 그런지는 정확하게 말씀을.. ㅡㅡa

    > > 지성.

    > >

    > > 아무튼 허접한 답변이라서 지성합니다.

    > >

    > >

    > >

    > >

    > >

    > > srookie wrote:

    > > > 김대웅 wrote:

    > > > > 안녕하세요.

    > > > >

    > > > > 제가 쓰레드와 타이머를 사용해서 db에 ado로 연결하는 동안 연결 시간을 타이머를

    > > > > 이용하여 표시를 해주는 건데요.

    > > > >

    > > > > 문제는 연결하는 동안 먹통이 되다가 연결 되면 그때서에 타이머가 동작을 하더라구요

    > > > >

    > > > > 그래서 검색해서 알려주신 몇가지를 사용을 해봤는데.. 그것으로도 해결이 안되더라구요

    > > > >

    > > > > 첫번째로 제가 쓰래드 안에 application.ProcessMessages; 을 사용하였는데도 먹통이였구요

    > > > >

    > > > > 그리고 excute 안에 Synchronize를 사용하여 따로 함수를 불러서 했는데도 마찬가지로

    > > > >

    > > > > 먹통 되다가 연결되면 그때서야 타이머가 작동하더라구요. 이거 어떻게 해야할지

    > > > >

    > > > > 모르겠군요. 제가 소스 올려 드릴테니 꼭 해결해주세요 부탁입니다. ^^

    > > > >

    > > > >

    > > > >

    > > > > TAdoconn = class(TThread) //쓰레드 생성

    > > > > private

    > > > > FADoConn : TADOConnection;

    > > > > procedure ConnectString;

    > > > > protected

    > > > > procedure Execute; override;

    > > > > public

    > > > > constructor Create(Adoconn : TADOConnection); virtual;

    > > > > end;

    > > > >

    > > > > var

    > > > > newThread : TAdoconn;

    > > > >

    > > > > implementation

    > > > >

    > > > > uses uMain , uAdo;

    > > > > {$R *.dfm}

    > > > >

    > > > > //쓰레드 생성 하여 작업을 할수 있도록 동시 작업을 하도록 한다.

    > > > >

    > > > > procedure TAdoconn.Execute;

    > > > > begin

    > > > > application.ProcessMessages;

    > > > > Synchronize(ConnectString);

    > > > > end;

    > > > >

    > > > > procedure TAdoconn.ConnectString;

    > > > > begin

    > > > > try

    > > > >

    > > > > fAdoconn.ConnectionString := '연결부분 여기는 생략'

    > > > > fadoconn.Connected := true;

    > > > > except

    > > > > fadoconn.Close;

    > > > > end;

    > > > > end;

    > > > >

    > > > >

    > > > > constructor TAdoconn.Create(ADOconn : TADOConnection);

    > > > > begin

    > > > > inherited create(true);

    > > > > FADoConn := AdoConn;

    > > > > FreeOnTerminate := true;

    > > > > Resume;

    > > > > end;

    > > > >

    > > > > //쓰레드 생성 과정 끝

    > > > >

    > > > >

    > > > > 이렇게 했는데요 타이머를 작동을 시키면서 쓰레드를 생성했는데.

    > > > > 먹통이 되더라구요.. 꼭 부탁드립니다.

    > > > >

    > > > > Ctime.Enabled := true;

    > > > > newThread := Tadoconn.Create(ado.AdoC);

    > > > > newThread.FreeOnTerminate := true;

    > > > > newthread.Resume;

    > > >

    > > > 안녕하세요.

    > > > Thread쪽의 Execute쪽에 문제가 있는것 같습니다.

    > > > 일단 Thread가 계속 살아 있기 위해서는 Application.ProcessMessage를 계속 수행해야 할 텐데 그게 없네요.

    > > > 그래서, Thread쪽에서 Application.Processmessage를 한 번 호출 한 후에 제거 되었을 겁니다.

    > > > while TRUE do

    > > > begin

    > > > application.ProcessMessages;

    > > > Synchronize(ConnectString);

    > > > end;

    > > >

    > > > 이런 식으로 Execute문을 바꿔 보시길...