![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы с потоком(загрузка проца-100%) [D5, WinXP]
Talla2k © (2004-04-23 12:40:00)Если потоковую ф-цию сделать так:
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 16:19:00) [1]
> насколько это ПРАВИЛЬНО???
правильно на все 100, потому что компилятор совершает все необходимые действия по разрушению интерфейсных объектов и пр., когда ты выходишь из обычной паскаль-процедуры штатным образом ..
при выходе по ExitThread ты "обламываешь" сам себя, поскольку в этом случае компилятор не несет никакой ответственности за твои действия
Talla2k (2004-04-23 15:34:00) [2]function potok(Param: Pointer): DWord; stdcall;
begin
...
Result:=0;
//exitthread(Result);
end;
Т.е. убрал exitthread(Result) и все заработало.
Остался последний вопрос : насколько это ПРАВИЛЬНО???
Talla2k (2004-04-23 15:08:00) [3]2 Digitman ©
Пардон конечно,но причем здесь ExitThread???
Ведь я выложил код который проходит и НЕ ПРОХОДИТ.
На мой взгляд все дело в этом:
if Supports(procitf,IHcSound,ifnp) then
ifnp.OutTone(20,800);
Я не освобождаю что-то...Что сам не знаю.
Cobalt (2004-04-23 13:38:00) [4]Вообще-то, освобождение интерфейсов происходит при выходе из процедуры, где объявлена эта переменная, или при присвоении ей NIL.
Digitman (2004-04-23 13:36:00) [5]кстати, 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 ? На основании чего у тебя святая уверенность, что ни годного исключения не произойдет ?
Digitman (2004-04-23 13:32:00) [6]с понятием "отладка программы" знаком ?