Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-1085226058
Talle
2004-05-22 15:40
2004.06.06
Использовать процедуры из Dll, написанного на С builder6?


3-1084610591
Гена Васечкин
2004-05-15 12:43
2004.06.06
Как можно программно прописать DSN в ODBC для ACCESS?


1-1085461099
korvin
2004-05-25 08:58
2004.06.06
Из-за принтера не работает программа.


14-1085052644
Igor_thief
2004-05-20 15:30
2004.06.06
Путин подписал антихакерский указ


3-1084539243
Fishka
2004-05-14 16:54
2004.06.06
В ComboBox-е для каждого Item свой Hint