NT 서버용 프로그램인데요.....
클라이언트에서 UDP로 회원ID와 IP가 날라오면, 리눅스 서버에 있는 PL/SQL을
실행시키는 아주 간단한 프로그램(?)인데요.......
첫번째 문제는
TStoredProc 컴포넌트가 520번 정도밖에 실행되지 않습니다.....
오라클의 버퍼 크기가 문제인가요?
컴포넌트는 WinShoes라는 UDP 컴포넌트를 쓰고 있는데 원래는 리스트 박스에
회원번호, IP를 계속보여주고(ListBox1.Items.Add(id + ip)) 오라클 PL/SQL을
실행하는데 520번 실행된후부터는 리스트박스에도 안나오고 PL/SQL도 안됩니다.
그렇다고 다운된것도 아니고..... Mistery
델도사님의 답변 부탁드립니다~~
두번째 문제는
그래서 Thread를 만들어서 해결 하는데 잘 안됩니다.
아래 코드 보시고 답변좀 부탁드려요. 꾸벅~
---------1번째는 WinAPI를 사용함---------------------------------
Type에
function ThreadProc1(P: Pointer):LongInt; stdcall;
procedure UDP1.read에(var에 ThreadID, ThreadHandle 선언후)
ThreadHandle := CreateThread(nil,0,@ThreadProc1,nil,0,ThreadID);
if(ThreadHandle = 0) then
MessageBox(Handle, 'No Thread', nil, MB_OK);
function TForm1.ThreadProc1(P: Pointer):LongInt; stdcall;
begin
StoredProc1.Params[0].AsInteger := t_id;
StoredProc1.Params[1].AsString := t_ip;
StoredProc1.ExecProc;
end; //t_id, t_ip는 전역 변수
*에러는 ThreadHandle := CreateThread(nil,0,@ThreadProc1,nil,0,ThreadID);
여기서 생깁니다. Veriable Required라는 에러닙니다.
----------2번째는 TThread를 사용함-----------------------------
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Winshoes, UDPWinshoe, StdCtrls, Db, DBTables;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Listener: TWinshoeUDPListener;
DataSourceGpss: TDataSource;
Database1: TDatabase;
StoredProc1: TStoredProc;
procedure ListenerUDPRead(Sender: TObject; const psData,
psPeer: String; const piPort: Integer);
private
public
end;
jThread = class(TThread)
whyStoredProc : TStoredProc;
private
public
constructor Create(StoredProc: TStoredProc); virtual;
protected
procedure Execute; override;
end;
var
Form1: TForm1;
t_id: Integer;
t_ip: String;
implementation
{$R *.DFM}
procedure TForm1.ListenerUDPRead(Sender: TObject; const psData,
psPeer: String; const piPort: Integer);
begin
listbox1.Items.Add(psData + ' ' + psPeer );
t_id := StrToInt(psData);
t_ip := psPeer;
jThread.Create(StoredProc1);
end;
constructor jThread.Create(StoredProc: TStoredProc);
begin
inherited Create(True);
whyStoredProc := StoredProc;
FreeOnTerminate := True;
Resume;
end;
procedure jThread.Execute;
begin
whyStoredProc.Prepare;
whyStoredProc.Params[0].AsInteger := t_id;
whyStoredProc.Params[1].AsString := t_ip;
whyStoredProc.ExecProc;
whyStoredProc.UnPrepare;
end;
end.
여기서도 520번 정도만 실행되고 종료시 EAccessViolation Error가 납니다......
SOS
##############################################################################
그럼 즐통되세요....(담부터는 짧게 올리겠슴니다^^)