Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2010, 14:36   #1
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию WebBrowser.Navigate в дополнительном потоке

Пытаюсь загрузить веб-страницу в дополнительном потоке, но никаких признаков жизни от программы не получаю(по завершению загрузки страницы она должна сделать определенные действия, но этого не происходит и даже HTTP Analyzer молчит), если гружу страницу в основном потоке все нормально...
procedure TNewThread.Execute;
begin
FMain.WebBrowser1.Navigate(TWeb1);
end;

Можно ли с этой проблемкой что-то сделать? Или WebBrowser.Navigate вообще не работает в дополнительном потоке?
Crystallon вне форума Ответить с цитированием
Старый 12.10.2010, 18:31   #2
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

запускай поток в режиме синхронизации. Потому что результат выполнения параллельного потока должен пересекаться с основным.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 12.10.2010, 22:21   #3
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Цитата:
Сообщение от Gambler Посмотреть сообщение
запускай поток в режиме синхронизации. Потому что результат выполнения параллельного потока должен пересекаться с основным.
Не могли бы вы подкрепить слова кодом?=) А то что-то не совсем пойму, вроде бы синхронизация нужна чтобы 2 потока не делали одновременно каких-либо действий, но ведь у меня такого итак не может произойти...
Crystallon вне форума Ответить с цитированием
Старый 13.10.2010, 11:24   #4
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

Вообще попробовал так:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, StdCtrls;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TNewThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TNewThread.Execute;
const
count = 5;
URL : array [1..count] of string =
('www.google.com','www.yandex.ru','vkontakte.ru','www.xakep.ru','www.bash.org.ru');
var i: integer;
begin
i:=1;
while true do
begin
  Form1.WebBrowser1.Navigate('http://'+URL[i]);
  inc(i);
  if i>count then i:=1;
  sleep(5000);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Th: TNewThread;
begin
th:=TNewThread.Create(false);
th.Resume;
end;

end.
и все прекрасно работало. Но если очень хочется синхронизировать потоки - переделаем. Обычно все действия с объектами другого потока (в данном случае форма и браузер) выносят в отдельный метод, который вызывается в режиме синхронизации.
Вот пример
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, SHDocVw, StdCtrls;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TNewThread = class(TThread)
  adr: string;
  private
    { Private declarations }
  protected
    procedure OpenURL;
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TNewThread.OpenURL;
begin
  Form1.WebBrowser1.Navigate('http://'+adr);
end;

procedure TNewThread.Execute;
const
count = 5;
URL : array [1..count] of string =
('www.google.com','www.yandex.ru','vkontakte.ru','www.xakep.ru','www.bash.org.ru');
var i: integer;
begin
i:=1;
while true do
begin
  adr:=URL[i];
  Synchronize(OpenURL);
  inc(i);
  if i>count then i:=1;
  sleep(5000);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Th: TNewThread;
begin
th:=TNewThread.Create(false);
th.Resume;
end;

end.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Закрытие программы после webbrowser1.Navigate ntro123 Общие вопросы Delphi 4 18.07.2010 15:22
Обработка события Onkeypress в дополнительном модуле vedro-compota Общие вопросы Delphi 2 01.05.2010 15:29
Сложение отрицательных чисел в дополнительном коде Fataller Помощь студентам 0 28.10.2009 19:12
TWebBrowzer.Navigate saltik Компоненты Delphi 5 22.09.2008 14:51
Динамическое создание компонента проходит нормально, но WB.Navigate не выполняется. В чём проблема? AVer Работа с сетью в Delphi 1 02.10.2007 14:48