Текущий архив: 2004.06.06;
Скачать: CL | DM;
Вниз
Проблемы с потоком(загрузка проца-100%) Найти похожие ветки
← →
Talla2k © (2004-04-23 12:40) [0]Если потоковую ф-цию сделать так:
function potok(Param: Pointer): DWord; stdcall;
var
lrst:_Recordset;
conn2:_Connection;
procitf:Variant;
{$IFDEF ADOVERCHECK}
ADOVer:Real;
ErrCode:Integer;
{$ENDIF}
ifnp:IHcSound;
i,ii:integer;
begin
CoInitialize(nil);
try
conn2:=CoConnection.Create;
conn2.Provider:="EQL OLE DB Provider";
conn2.Properties["DBMS Name"].Value:="L2Com.HcComSessionCreator";
conn2.open("2;0;38400;","1","0",Integer(adConnectUnspecified));
lrst:=CoRecordset.Create;
lrst.Open("EQL_service",conn2,Integer(adOpenUnspecified),
Integer(adLockUnspecified),adCmdTableDirect);
procitf:=lrst.Fields["Procedure"].Value;
{$IFDEF ADOVERCHECK}
Val(conn2.Version,ADOVer,ErrCode);
if (ErrCode<>0) or (ADOVer<2.6) then begin
IDispatch(TVarData(procitf).VDispatch)._Release;
IDispatch(TVarData(procitf).VDispatch)._Release;
end;
{$ENDIF}
procitf:=0;
lrst.Close;
conn2.Close;
finally
CoUninitialize; end;
Result:=0;
exitthread(Result);
end;
ТО все в порядке.Загрузка процессора нормальная и поток я могу вызывать сколько угодно.
Меняю потоковую ф-цию :
function potok(Param: Pointer): DWord; stdcall;
var
lrst:_Recordset;
conn2:_Connection;
procitf:Variant;
{$IFDEF ADOVERCHECK}
ADOVer:Real;
ErrCode:Integer;
{$ENDIF}
ifnp:IHcSound;
i,ii:integer;
begin
CoInitialize(nil);
try
conn2:=CoConnection.Create;
conn2.Provider:="EQL OLE DB Provider";
conn2.Properties["DBMS Name"].Value:="L2Com.HcComSessionCreator";
conn2.open("2;0;38400;","1","0",Integer(adConnectUnspecified));
lrst:=CoRecordset.Create;
lrst.Open("EQL_service",conn2,Integer(adOpenUnspecified),
Integer(adLockUnspecified),adCmdTableDirect);
procitf:=lrst.Fields["Procedure"].Value;
{$IFDEF ADOVERCHECK}
Val(conn2.Version,ADOVer,ErrCode);
if (ErrCode<>0) or (ADOVer<2.6) then begin
IDispatch(TVarData(procitf).VDispatch)._Release;
IDispatch(TVarData(procitf).VDispatch)._Release;
end;
{$ENDIF}
// !!! Добавил ТОЛЬКО ЭТО !!!
if Supports(procitf,IHcSound,ifnp) then
ifnp.OutTone(20,800);
//
procitf:=0;
lrst.Close;
conn2.Close;
finally
CoUninitialize; end;
Result:=0;
exitthread(Result);
end;
Теперь после вызова потока получаю 100% загрузку процессора да и поток второй раз уже не вызывается.
На сколько я понял нужно закрывать ifnp,но у него нет close или может я не правильно закрыл procitf.
Подскажите как быть???
З.Ы. Если этот код выполнить без потока,то все нормально...Даже без procitf:=0;и lrst.Close;
← →
Digitman © (2004-04-23 13:32) [1]с понятием "отладка программы" знаком ?
← →
Digitman © (2004-04-23 13:36) [2]кстати, ExitThread, там где ты его употребил, вовсе не обязателен
читаем сюда
ExitThread is the preferred method of exiting a thread. When this function is called (either explicitly or by returning from a thread procedure), the current thread"s stack is deallocated and the thread terminates
кр.того, почему тело поточной ф-ции не обрамлено в try ..except ? На основании чего у тебя святая уверенность, что ни годного исключения не произойдет ?
← →
Cobalt © (2004-04-23 13:38) [3]Вообще-то, освобождение интерфейсов происходит при выходе из процедуры, где объявлена эта переменная, или при присвоении ей NIL.
← →
Talla2k © (2004-04-23 15:08) [4]2 Digitman ©
Пардон конечно,но причем здесь ExitThread???
Ведь я выложил код который проходит и НЕ ПРОХОДИТ.
На мой взгляд все дело в этом:
if Supports(procitf,IHcSound,ifnp) then
ifnp.OutTone(20,800);
Я не освобождаю что-то...Что сам не знаю.
← →
Talla2k © (2004-04-23 15:34) [5]function potok(Param: Pointer): DWord; stdcall;
begin
...
Result:=0;
//exitthread(Result);
end;
Т.е. убрал exitthread(Result) и все заработало.
Остался последний вопрос : насколько это ПРАВИЛЬНО???
← →
Digitman © (2004-04-23 16:19) [6]
> насколько это ПРАВИЛЬНО???
правильно на все 100, потому что компилятор совершает все необходимые действия по разрушению интерфейсных объектов и пр., когда ты выходишь из обычной паскаль-процедуры штатным образом ..
при выходе по ExitThread ты "обламываешь" сам себя, поскольку в этом случае компилятор не несет никакой ответственности за твои действия
Страницы: 1 вся ветка
Текущий архив: 2004.06.06;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.039 c