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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2010, 18:15   #1
kardinal94
Форумчанин
 
Аватар для kardinal94
 
Регистрация: 26.04.2010
Сообщений: 105
По умолчанию Синхронизация потоков

Всем добрый день. Возникла проблема с синхронизацией потоков. Есть определенная программа о которой я писал тут, там же можете найти и исходник+компилированный файл. Проблема заключается в синхронизации потоков. Поток у меня создается с помощью:
Код:
TNewThread = class(Tthread)
    private
    protected
    procedure Execute; override;
    public
        constructor Create(CreateSuspended:boolean);
  end;
---------------
   constructor TNewThread.Create(CreateSuspended: Boolean);
  begin
  inherited create(createSuspended);
  end;
Запускается при клике на кнопку:
Код:
TnewThread.Create(false);
, в самом потоке содержится формирование POST запросов и отправка их на сервер. При формировании запросов поток обращается к компонентам, которые относятся к основной форме программы (TMemo, Tedit, TLabel). При этом в Windows 7 начинают возникать проблемы при наведении на какой то Edit, в XP при свертывании и развертывании более двух раз, проблемы типа

Часть кода потока:
Код:
procedure TNewThread.Execute;
var udach, CapB,CapEnd, pos1, posex1, usp, neiz:integer;
POstData:TstringList;
Captcha1:TMemoryStream;
Otvet, CapUrl, stat1, cid, sid, fbi:string;
   begin
 PostData:=TstringList.Create;
{Выполняю операцию с первым сайтом в списке}
if form1.CheckListBox1.Checked[3] then
  try
      Postdata.clear;
     Form1.proc.Lines.Add(' Начинаю регистрацию на сайте '+Form1.CheckListBox1.Items.Strings[3]); // Обращение к Memo
     Otvet:=Form1.IdHTTP1.Get('http://astraclub.ru/forum/profile.php?mode=register&agreed=true');
     {Получаю каптчу}
     Form1.proc.Lines.Add(' Получаю каптчу с сайта '+Form1.CheckListBox1.Items.Strings[3]);
     Pos1:= pos('name="confirm_id" value="',otvet);
     PosEx1:= posex('/', otvet, pos1+25);
     cid:=copy(otvet,pos1+25, posex1-pos1-27);
     capurl:=('http://astraclub.ru/profile.php?mode=confirm&id='+cid);
     Captcha1:=TMemoryStream.Create;
     form1.IdHTtp1.Get(capUrl,Captcha1);
     Captcha1.Position:=0;
     Captcha1.savetoFile('1.png');
    Form1.WebBrowser1.Navigate(ExtractFilePath(ParamStr(0))+'1.png');
 {Формирование запроса}
     PostData.Add('username='+form1.Login.Text); // Обращение к Edit
     PostData.Add('name_first='+form1.name.Text); // Обращение к Edit
     PoStData.Add('name_last='+form1.famil.Text); // Обращение к Edit
     PostData.Add('email='+form1.mail.Text); // Обращение к Edit
     Form1.proc.Lines.Add(' Получил каптчу, жду ввода '+Form1.CheckListBox1.Items.Strings[5]);
      while form1.Capt.Tag=0 do sleep(1000); {ожидание нажатия клавиши после ввода каптчи для отправки запроса}
     form1.Capt.Tag:=0;
  {Не относящиеся к проблеме участки кода с простым формированием POST запроса}
   OtVet:=form1.IdHTTP1.Post('http://astraclub.ru/forum/profile.php', PostData);
     if pos('Вы ввели неверный код подтверждения', otvet)<>0 then
     form1.proc.Lines.Add('ОШИБКА: Вы ввели неверный код подтверждения');
        if Pos('Учётная запись была создана', Otvet)<>0 then
         form1.proc.Lines.Add('Учётная запись была создана. . Проверьте вашу почту и подтвердите регистрацию.');
      Form1.proc.Lines.Add('-----Регистрация на сайте '+Form1.CheckListBox1.Items.Strings[3]+' завершена-----');
     except
       Form1.proc.Lines.Add('Error!');
       end;
Таким примерно образом отправляются запросы более чем на 50 сайтов. Хотелось бы понять, как правильно синхронизировать основной VCL поток и второй, создаваемый мною. Перечитал много литературы, пока понятно мало что.
kardinal94 вне форума Ответить с цитированием
Старый 29.11.2010, 20:11   #2
kardinal94
Форумчанин
 
Аватар для kardinal94
 
Регистрация: 26.04.2010
Сообщений: 105
По умолчанию

Неужели никто не знает? Подскажите хотя бы как правильно использовать метод Synchronize
kardinal94 вне форума Ответить с цитированием
Старый 29.11.2010, 20:27   #3
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

КАК вызываеш?
bulldog5293 вне форума Ответить с цитированием
Старый 29.11.2010, 20:41   #4
kardinal94
Форумчанин
 
Аватар для kardinal94
 
Регистрация: 26.04.2010
Сообщений: 105
По умолчанию

Что вызываю? Поток?
kardinal94 вне форума Ответить с цитированием
Старый 29.11.2010, 20:53   #5
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Цитата:
Сообщение от kardinal94 Посмотреть сообщение
Неужели никто не знает? Подскажите хотя бы как правильно использовать метод Synchronize
Создаёшь какую нить процедуру, которая обращается к основному потоку, а потом её вызываешь методом Syncronize.
Например есть процедура
Код:
procedure InfoCaption (s : string);
begin
  Form1.Caption := s;
end;
А уже в потоке вызываешь
Syncronize (InfoCaption ('Text'));
FaTaL вне форума Ответить с цитированием
Старый 29.11.2010, 21:13   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Подскажите хотя бы как правильно использовать метод Synchronize
Открой Делфи, создай проект Thread. и почитай коментарии - там как раз пишут о том как правильно ее использовать.
Еще, как писал Михалыч :
Цитата:
Открываем имеющийся в составе Дельфи демонстрационный проект с синхронизацией потоков - Borland\Delphi7\Demos\Threads\thrdd emo.dpr...
Изучаем, особенно файл SortThds.pas
Добавлю:
http://www.realcoding.net/article/view/158
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация потоков alenka_ej Помощь студентам 0 03.06.2010 22:20
Синхронизация потоков в С++ erazer89 Помощь студентам 0 27.04.2010 20:14
синхронизация потоков m_kostik Win Api 0 26.03.2010 23:56
Синхронизация потоков с использованием именованых каналов _Денис Помощь студентам 0 09.01.2010 16:58