![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
работа с потоками
Ekate © (2007-08-03 11:32:00)Здравствуйте,уважаемые эксперты!
Снова обращаюсь за вашей помощью.
Я вызываю дочерний поток (далее поток_2) из потока(поток_1),который опять же является дочерним к основной программе.
Поток_2 имеет параметр,значение которого передается потоком_1.
Т.е. конструктор потока_2 выглядит следующим образом:
constructor TBr.create(param: string; createsuspended: boolean);
begin
inherited create(true);
par := param;
if not createsuspended then
resume
end;
При чем, в зависимости от определенного условия поток_2 необходимо перезапускать с новым значением параметра.
Код перезапуска потока_2
//if process is runnig then terminate it
if (br<>nil) then
begin
br.Terminate;
br.WaitFor;
br := nil;
end;
//and run it again with certain parameters
br:=TBr.Create(anotherParam,true);
br.Resume;
br.Priority:=tpnormal;
Поток_2 представляет собой сканирование URL активного окна браузера и выполняет работу с тектовым файлом.
Основные процедуры потока_2
function GetUrl:string;
var Winds: IShellWindows;
IEWB: IWebBrowser2;
i: integer;
Doc: IHtmlDocument2;
begin
Winds:=CoShellWindows.Create;
for i:=0 to Winds.Count-1 do
if (Winds.Item(i) as IWEbBrowser2).Document<>nil then
begin
IEWB:=Winds.Item(i) as IWEbBrowser2;
if IEWB.Document.QueryInterface(IhtmlDocument2, Doc)= S_OK
then Result:=Doc.url;
end;
end;
procedure TBr.Execute;
var
f:textFile;
s:string;
begin
CoInitialize(nil);
while not Terminated do begin
s:=GetURL;
if IfExists(param+'@'+s)=false then // if record doesn't exist then append it to the file
begin
assignFile(f,'toy.txt');
append(f);
writeln(f,param+'@'+s);
CloseFile(F);
end ;
end;
CoUnInitialize;
exit;
end;
Собственно вопрос:
При работе приложения выскакивает следующая ошибка:
Project raised exception class EOleException with message 'Unspecified error'.
Ругается на строку
if (Winds.Item(i) as IWEbBrowser2).Document<>nil then...
в функции GetUrl
Если поток не останавливать и не перезапускать,то все работает.Но мне необходимо делать перезапуск при выполнении определнного условия.
Подскажите,в чем может быть ошибка.
Всего наилучшего,
Ekate
Сергей М. (2007-08-03 12:25:00) [41]
> активной в данный момент странички
И где происходит проверка на активность ?
Ekate (2007-08-03 12:21:00) [42]Спасибо за участие,
Сергей,
Не интересуют, мне необходимо знать только URL активной в данный момент странички
Сергей М. (2007-08-03 12:16:00) [43]Хм ..
Мне совершенно непонятна логика ф-ции GetURL.
Ф-ция всегда возвращает URL документа самого последнего (в списке интерфейса Winds) найденного экз-ра IE.
А остальные экз-ры что, не интересуют ?
Ekate (2007-08-03 12:06:00) [44]Запуск IE идет в потоке_1 до вызова потока_2.
Участок кода потока_1 следующий
//поток выполняется себе, но как только удовлетворяет условию, то
if checking(sSnr) = false then
begin
ShellExecute(Handle,'open',Pchar(' http://localhost/static/userlogin.php?param1='+sSnr),nil,nil, SW_SHOWNORMAL);
//if process is runnig then terminate it
if (br<>nil) then
begin
br.Terminate;
br.WaitFor;
br := nil;
end;
//and run it again with certain parameters
br:=TBr.Create(sSnr,true);
br.Resume;
br.Priority:=tpnormal;
end;
Сергей М. (2007-08-03 12:02:00) [45]
> теперь вообще потоки не запускают IE
А где твои потоки запускали IE доэтого ?
Что-то не вижу никаких запусков ..
Ekate (2007-08-03 11:58:00) [46]Нет, это не решило проблему. Более того, теперь вообще потоки не запускают IE и не хотят с ним работать
Игорь Шевченко (2007-08-03 11:53:00) [47]
> Undeclared identifier: 'COINIT_MULTITHREADED'
uses ActiveX;
Ekate (2007-08-03 11:51:00) [48]Хм,почему то говорит
Undeclared identifier: 'COINIT_MULTITHREADED'
Игорь Шевченко (2007-08-03 11:35:00) [49]Попробуй CoInitFlags установить в COINIT_MULTITHREADED в самом начале проекта