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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2016, 11:10   #1
enzogord
 
Регистрация: 28.09.2012
Сообщений: 5
По умолчанию Зависание приложения при динамическом создании компонентов на событии OnUDPRead

Добрый день. Такая вот проблема:
Программа при получении определенной информации по UDP должна создать динамически компонент на форме.

При создании их кнопкой все отлично. А вот при создании в событии IdUDPServer.OnUDPRead, они создаются, но зависает приложение. Не могу понять в чем дело, может кто-нибудь помочь объяснить?
Вот код программы (XE8):

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent, IdUDPBase,
  IdUDPServer, IdGlobal, IdSocketHandle, Vcl.StdCtrls, Vcl.ComCtrls,
  Vcl.OleCtnrs, Vcl.ExtCtrls, Data.Bind.EngExt, Vcl.Bind.DBEngExt, System.Rtti,
  System.Bindings.Outputs, Vcl.Bind.Editors, Data.Bind.Components;

type
  TForm1 = class(TForm)
    IdUDPServer1: TIdUDPServer;
    Edit1: TEdit;
    ProgressBar1: TProgressBar;
    Panel1: TPanel;
    Panel2: TPanel;
    Label1: TLabel;
    PlatePanel: TPanel;
    Button2: TButton;
    procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
      const AData: TIdBytes; ABinding: TIdSocketHandle);
    procedure Button2Click(Sender: TObject);
    procedure CreatePlate(PlateNumber: integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Panel, SubBtnPanel: TPanel;
  Btn, Btn2: TButton;
  PlateLabel: TLabel;

implementation

{$R *.dfm}

procedure TForm1.CreatePlate(PlateNumber: integer);
begin
  Panel := TPanel.Create(PlatePanel);
  Panel.Parent := PlatePanel;
  Panel.AlignWithMargins := true;
  Panel.Margins.SetBounds(2,0,0,0);
  Panel.Width := 120;
  Panel.Left := Panel.Width*PlatePanel.ComponentCount;
  Panel.Align := alLeft;
  Panel.Name := 'Plate' + IntToStr(PlatePanel.ComponentCount-1);
  Panel.Caption:= Panel.Name;

  SubBtnPanel := TPanel.Create((PlatePanel.FindComponent(Panel.Name) as TPanel));
  SubBtnPanel.Parent := (PlatePanel.FindComponent(Panel.Name) as TPanel);
  SubBtnPanel.AlignWithMargins := true;
  SubBtnPanel.Margins.SetBounds(0,0,0,0);
  SubBtnPanel.Align := alBottom;
  SubBtnPanel.Height := 54;
  SubBtnPanel.Name := 'SubBtnPanel' + IntToStr(PlatePanel.ComponentCount-1);
  SubBtnPanel.Caption:= SubBtnPanel.Name;

  PlateLabel := TLabel.Create((PlatePanel.FindComponent(Panel.Name) as TPanel));
  PlateLabel.Parent := (PlatePanel.FindComponent(Panel.Name) as TPanel);
  PlateLabel.AlignWithMargins := true;
  PlateLabel.Margins.SetBounds(0,0,0,0);
  PlateLabel.Height := 25;
  PlateLabel.Align := alTop;
  PlateLabel.Name := Panel.Name + 'PlateLabel';
  PlateLabel.Caption := 'Плата №' + IntToStr(PlateNumber);

  Btn := TButton.Create((Panel.FindComponent(SubBtnPanel.Name) as TPanel));
  Btn.Parent := (Panel.FindComponent(SubBtnPanel.Name) as TPanel);
  Btn.AlignWithMargins := true;
  Btn.Margins.SetBounds(0,0,0,2);
  Btn.Height := 25;
  Btn.Align := alTop;
  Btn.Name := Panel.Name + 'BtnOn';
  Btn.Caption := Btn.Name;

  Btn2 := TButton.Create((Panel.FindComponent(SubBtnPanel.Name) as TPanel));
  Btn2.Parent := (Panel.FindComponent(SubBtnPanel.Name) as TPanel);
  Btn2.AlignWithMargins := true;
  Btn2.Margins.SetBounds(0,2,0,0);
  Btn2.Height := 25;
  Btn2.Align := alTop;
  Btn2.Name := Panel.Name + 'BtnOff';
  Btn2.Caption := Btn2.Name;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Panel, SubBtnPanel: TPanel;
  Btn, Btn2: TButton;
  PlateLabel: TLabel;
begin
  Panel := TPanel.Create(PlatePanel);
  Panel.Parent := PlatePanel;
  Panel.AlignWithMargins := true;
  Panel.Margins.SetBounds(2,0,0,0);
  Panel.Width := 120;
  Panel.Left := Panel.Width*PlatePanel.ComponentCount;
  Panel.Align := alLeft;
  Panel.Name := 'Plate' + IntToStr(PlatePanel.ComponentCount-1);
  Panel.Caption:= Panel.Name;

  SubBtnPanel := TPanel.Create((PlatePanel.FindComponent(Panel.Name) as TPanel));
  SubBtnPanel.Parent := (PlatePanel.FindComponent(Panel.Name) as TPanel);
  SubBtnPanel.AlignWithMargins := true;
  SubBtnPanel.Margins.SetBounds(0,0,0,0);
  SubBtnPanel.Align := alBottom;
  SubBtnPanel.Height := 54;
  SubBtnPanel.Name := 'SubBtnPanel' + IntToStr(PlatePanel.ComponentCount-1);
  SubBtnPanel.Caption:= SubBtnPanel.Name;

  PlateLabel := TLabel.Create((PlatePanel.FindComponent(Panel.Name) as TPanel));
  PlateLabel.Parent := (PlatePanel.FindComponent(Panel.Name) as TPanel);
  PlateLabel.AlignWithMargins := true;
  PlateLabel.Margins.SetBounds(0,0,0,0);
  PlateLabel.Height := 25;
  PlateLabel.Align := alTop;
  PlateLabel.Name := Panel.Name + 'PlateLabel';
  PlateLabel.Caption := 'Плата №' + IntToStr(PlatePanel.ComponentCount);


  Btn := TButton.Create((Panel.FindComponent(SubBtnPanel.Name) as TPanel));
  Btn.Parent := (Panel.FindComponent(SubBtnPanel.Name) as TPanel);
  Btn.AlignWithMargins := true;
  Btn.Margins.SetBounds(0,0,0,2);
  Btn.Height := 25;
  Btn.Align := alTop;
  Btn.Name := Panel.Name + 'BtnOn';
  Btn.Caption := Btn.Name;

  Btn2 := TButton.Create((Panel.FindComponent(SubBtnPanel.Name) as TPanel));
  Btn2.Parent := (Panel.FindComponent(SubBtnPanel.Name) as TPanel);
  Btn2.AlignWithMargins := true;
  Btn2.Margins.SetBounds(0,2,0,0);
  Btn2.Height := 25;
  Btn2.Align := alTop;
  Btn2.Name := Panel.Name + 'BtnOff';
  Btn2.Caption := Btn2.Name;
  if (PlatePanel.ComponentCount = 5) then  Panel.Free;
end;

procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
var
  a: integer;
  s: integer;
begin
  s:= (AData[0] shl 24)+(AData[1] shl 16)+(AData[2] shl 8)+(AData[3] shl 0);
  if(s = 589624731) then
  begin
    a:= AData[4];
    if (a = 2)then
     begin
      edit1.Text := IntToStr(s);
      CreatePlate(a);
      showmessage('Создано');
     end;
  end;
end;

end.

Последний раз редактировалось enzogord; 20.11.2016 в 11:42.
enzogord вне форума Ответить с цитированием
Старый 20.11.2016, 11:26   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

ThreadedEvent какое?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.11.2016, 11:45   #3
enzogord
 
Регистрация: 28.09.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
ThreadedEvent какое?
Было True :D Поменял, заработало. Спасибо, добрый человек)
enzogord вне форума Ответить с цитированием
Старый 20.11.2016, 12:21   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код в OnUDPRead должен быть максимально быстродействующим. А у тебя целая песня с vcl
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.11.2016, 17:42   #5
enzogord
 
Регистрация: 28.09.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код в OnUDPRead должен быть максимально быстродействующим. А у тебя целая песня с vcl
Это пока только тесты, обязательно избавлюсь от лишнего. Спасибо за совет
enzogord вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компонент sPageControl, ошибка при динамическом создании sTabSheet. Teoret Компоненты Delphi 2 23.10.2014 07:37
Ошибки в выполнении программы при динамическом создании структуры Hy6 Помощь студентам 0 18.05.2013 10:55
обработка событий при динамическом создании Veronikaa Компоненты Delphi 4 10.05.2012 17:13
Глюк при динамическом создании Label. BingoBongo Общие вопросы Delphi 2 10.05.2011 19:41
Mootools.Проблема определения события OnClick элемента списка при его динамическом создании. ilusha JavaScript, Ajax 2 25.02.2009 10:43