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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2012, 19:48   #1
Liserk
 
Регистрация: 15.03.2012
Сообщений: 8
По умолчанию При нажатии кнопки с потоком выдает ошибку

Здравствуйте, в общем такая проблема. На картинке часть интерфейса на котором хочу, чтобы при нажатии на кнопку radiobutton (авто), radiobutton РП1, РП2... начали показывать, что идёт сигнал (т.е. сначала в РП1 появляется точка, потом исчезает и появляется в РП2 и т.д.). Я решил воспользоваться потоками, потому что программа зависала. Вот код
Код:
 //Описывается класс, для использования потока
   TPotok = class(TThread)
     private
   protected
     procedure Execute; override;
   end;

var
  Form1: TForm1;
  Potok: TPotok;

implementation
uses Unit2, Unit3;

{$R *.dfm}

//Нужно создать процедуру Execute, уже описанную в классе TPotok
procedure TPotok.Execute;
var
rp1: TRadioButton;         rp2: TRadioButton;
    rp3: TRadioButton;         rp4: TRadioButton;
    rp5: TRadioButton;         rp6: TRadioButton;
    rp7: TRadioButton;         rp8: TRadioButton;
begin
rp1.Checked:=true;
begin
 if rp1.Checked=true then
 begin
 rp2.Checked:=true;
 Application.ProcessMessages;
 sleep(3000);
 rp1.Checked:=false;
 end;
   if rp2.Checked=true then
   begin
   rp3.Checked:=true;
   Application.ProcessMessages;
   sleep(3000);
   rp2.Checked:=false;
   end;
    if rp3.Checked=true then
    begin
    rp4.Checked:=true;
    Application.ProcessMessages;
    sleep(3000);
    rp3.Checked:=false;
    end;
      if rp4.Checked=true then
      begin
      rp5.Checked:=true;
      rp4.Checked:=false;
      Application.ProcessMessages;
      sleep(3000);
      end;
        if rp5.Checked=true then
        begin
        rp6.Checked:=true;
        rp5.Checked:=false;
        Application.ProcessMessages;
        sleep(3000);
        end;
          if rp6.Checked=true then
          begin
          rp7.Checked:=true;
          rp6.Checked:=false;
          Application.ProcessMessages;
          sleep(3000);
          end;
            if rp7.Checked=true then
            begin
            rp8.Checked:=true;
            rp7.Checked:=false;
            Application.ProcessMessages;
            sleep(3000);
            end;
              if rp8.Checked=true then
              begin
              rp1.Checked:=true;
              rp8.Checked:=false;
              Application.ProcessMessages;
              sleep(3000);
         end;
end;
end;

procedure TForm1.avtoClick(Sender: TObject);
var
  Potok: TPotok;
begin
//Вначале нужно создать экземпляр потока:
   Potok:=TPotok.Create(true);
//Параметр False запускает поток сразу после создания, True - запуск
впоследствии , методом Resume
//Можно указать что после завершения кода поток завершится автоматически:
   Potok.FreeOnTerminate:=true;
//Далее можно указать параметры потока, например приоритет:
   Potok.Priority:=tpNormal;
 Potok.Resume;
end;
При нажатии на кнопку Авто программа выдает ошибку. Когда пробовал пошагово проверить, то оказалось, что программа зависает после выполнения кода - Potok.Resume; end;
Подскажите, пожалуйста, как разрешить эту проблему? (Если это важно то у меня Delphi 2010, ОС - Windows 7(x64))
Изображения
Тип файла: png Proga.png (12.7 Кб, 41 просмотров)
Тип файла: png error.png (56.9 Кб, 52 просмотров)
Liserk вне форума Ответить с цитированием
Старый 15.03.2012, 20:04   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

таймер рулит
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i:integer;
  radio:array of TRadioButton;
begin
  for i:=0 to Form1.ControlCount-1 do
  begin
    if Controls[i] is TRadioButton then
    begin
      SetLength(radio,Length(radio)+1);
      radio[Length(radio)-1]:=TRadioButton(Controls[i]);
    end;
  end;
  for i:=low(radio) to high(radio) do
  begin
    if radio[i].Checked then
    begin
      radio[i].Checked:=false;
      if i=high(radio) then
        radio[low(radio)].Checked:=true
      else
        radio[i+1].Checked:=true;
      exit;
    end;
  end;
  if Length(radio)>0 then
    radio[low(radio)].Checked:=true;
end;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 15.03.2012, 20:09   #3
Liserk
 
Регистрация: 15.03.2012
Сообщений: 8
По умолчанию

Насчет оптимизации с кнопками radiobutton большое спасибо, а вот как быть с потоком, почему ошибку выдает?
Liserk вне форума Ответить с цитированием
Старый 15.03.2012, 20:11   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
а вот как быть с потоком, почему ошибку выдает?
Потому, что о синхронизации не имеете понятия
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.03.2012, 20:20   #5
Liserk
 
Регистрация: 15.03.2012
Сообщений: 8
По умолчанию

Про синхронизацию читал на сайтах 3-4, но в итоге понял мало, единственно думаю подставить в procedure TPotok.Execute; сточку - Synchronize(Timer1Timer). Как думаете так правильно будет?
Liserk вне форума Ответить с цитированием
Старый 15.03.2012, 20:41   #6
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

правильно - следовать советам знающих
бутылку из под шампанского можно в задницу засунуть - доказано, но вот результат плачевен... тебе оно надо?
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 15.03.2012, 20:49   #7
Liserk
 
Регистрация: 15.03.2012
Сообщений: 8
По умолчанию

Просто дело в том, что пока программа будет работать в автоматическом режиме(т.е. будет показывать как сигналы переходят), мне нужно чтобы и остальная часть программы работала. Т.е. нажал работу в автоматическом режиме, сигналы пошли, и пока сигналы идут, рассчитать там например введёные значения. (У меня половина программы пойдёт за основу для дипломника, поэтому мне больше, чем бутылка шампанского нужна будет)
Liserk вне форума Ответить с цитированием
Старый 15.03.2012, 22:26   #8
Liserk
 
Регистрация: 15.03.2012
Сообщений: 8
По умолчанию

Тему можно закрывать, уже понял в чем фишка таймера (я немного тугодум), код правда осталось поменять чуток и считай дипломник уже близко. Спасибо за помощь!
Liserk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение цвета кнопки при ее нажатии RedRec Microsoft Office Excel 2 04.08.2011 09:11
Прога вылетает при нажатии кнопки.. Дмитрий142 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 15.03.2011 08:36
Скрытие кнопки при нажатии на нее MyLastHit Общие вопросы Delphi 10 03.08.2010 22:23
Запуск формы при нажатии кнопки SkrudjMakdak Microsoft Office Excel 4 30.07.2010 22:29
Ошибка при нажатии кнопки Skynet91 БД в Delphi 1 08.02.2010 19:45