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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2011, 15:33   #1
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию пятой точкой чувствую - потоки

И здравствуйте снова.
Сразу к сути - есть статики на форме, их хэндлы с грехом пополам, с помощью этого форума я узнал, огромное спасибо. Шаг следующий - мне нужно циклично снимать показания с ряда статиков.Я подумал что постоянный цикл мне программу просто завесит и стал копать потоки.
То что у меня получилось почти всё перед вами, см. ниже. И вот по моему разумению все бы вроде должно работать, только ничего не работает. Вылетает ошибка "Exception class EAbstractError". Я думаю что тут корявая реализация потоков, но в чём заковыка понять не могу. Подскажите пожалуйста кто нибудь что нибудь.

По потоку - исполняемый код в другой процедуре т.к. думал не забивать главный код потока, туда ещё прийдётся много чего дописывать.

Выделил относящееся к потоку жирным: нажимаем кнопку 1, создаётся поток, запускает процесс с взятием значений и рассовыванием в рабочий массив и в тэдиты (для наглядности на стадии написания). Поставил метку внутри кода потока (thread.Execute) и запустил отладку, в пошаговом режиме после создания потока программа делает непонятно что - на метки не ловится, что мне непонятно вовсе на метку в коде потока тоже не ловится! как будто до запуска потока дело не доходит.

нажимаю ран - вылетает ошибка в отладчике, в программе все тихо, ни ошибок ни значений в эдите.

Код:
unit Main;
............
type

  TForm1 = class(TForm)
..........
  thread=class(tthread)
  private
  procedure ReadNLoop(StaticN: array of integer);
  protected
  procedure Execute(StaticN: array of integer);
  end;

var

  Form1: TForm1;
  MainDlg: HWND;
  Values: Array [0..32] of Integer;
  StaticHnd: Array [0..31] of THandle;
  TimerFlag:Integer = 0;
  Check: thread;

implementation

{$R *.dfm}

procedure TForm1.Start(Sender: TObject);
begin
ShellExecute (MainDlg, nil, PChar('c:/usbmfc_0227.exe'),nil,nil,SW_HIDE);
end;

procedure thread.Execute(StaticN: array of integer);
begin
 while not Terminated do
 ReadNLoop(StaticN);
end;

procedure thread.ReadNLoop(StaticN: array of integer);
var
i: integer;
begin
sleep(500);
for i:=Low(StaticN) To High(StaticN) do
 begin
  Values[StaticN[i]]:=StrToInt(GetText(StaticHnd[StaticN[i]]));
  TEdit(Form1.FindComponent('Edit'+IntToStr(StaticN[i]+1))).Text:=IntToStr(Values[StaticN[i]]);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,h: integer;
StaticN: Array of integer;
begin
SetLength(StaticN,50);
h:=0;
for i:=0 to 17 do
 begin
  if (findcomponent(format('CheckBox%d',[i+1])) as tcheckbox).checked=true then
   begin
   SetLength(StaticN,h+1);
   StaticN[h]:=i;
   inc(h);
   end;
 end;
If Length(StaticN)=50 then Exit;
Check:=thread.create(false);
Check.freeonterminate:=true;
Check.priority:=tplowest;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ShowWindow(MainDlg,SW_SHOWNORMAl);
end;

procedure TForm1.StartInit(Sender: TObject);
begin
Form1.Timer1.Enabled:=false;
MainDlg:=FindWindow(nil,'USBMFC');
if MainDlg = 0 then              
 begin                           
 TimerFlag:=TimerFlag+1;
 If TimerFlag=400 then
  begin
  ShowMessage('USBMFS ia caioneaaony');
  Exit;                     
  end;
 Form1.Timer1.Interval:=15;
 Form1.Timer1.Enabled:=true;
 end;
ShowWindow(MainDlg,SW_HIDE);
SendMessage(FindWindowEx(MainDlg,0,'Button','Start Reading'),WM_LBUTTONDOWN,0,0);
SendMessage(FindWindowEx(MainDlg,0,'Button','Start Reading'),WM_LBUTTONUP,0,0);
StaticHndEnum([$000003e9,$000003ef,$000003ed,$000003f0,$000003fb,$000003ff,
$000003fd,$00000400,$00000432,$00000433,$00000434,$00000435,$00000436,
$00000437,$00000438,$00000439,$0000043b,$0000043f,$0000043d,$00000440,
$00000443,$00000447,$00000445,$00000448,$00000472,$00000473,$00000474,
$00000475,$00000476,$00000477,$00000478,$00000479]);  
end;

end.
Тока не пинайте меня, у меня стажа нет вовсе, я понимаю что всё криво. Может что и посоветуете сразу по оптимизации....

буду рад любым ответам
BoozZzilla вне форума Ответить с цитированием
Старый 14.03.2011, 16:04   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
есть статики на форме
Кто такие "статики" и на чьей они форме ?
mss вне форума Ответить с цитированием
Старый 14.03.2011, 16:09   #3
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

Компоненты Static на форме чужой программы
вот тут я мусолил мои статики
http://www.programmersforum.ru/showthread.php?t=141734
BoozZzilla вне форума Ответить с цитированием
Старый 14.03.2011, 16:14   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

А где у тебя перекрытие абстрактного метода Execute ?
mss вне форума Ответить с цитированием
Старый 14.03.2011, 16:26   #5
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

ринулся читать про абстрактные методы - не всасываю...
что такое "перекрытие"?
я пока читал про протоки решил что Execute - стандартный метод tthread, а у меня вроде как класс дочерний - должен унаследовать? не? я не так всё понял?
BoozZzilla вне форума Ответить с цитированием
Старый 14.03.2011, 16:35   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
я не так всё понял?
Единственное что ты правиль понял - это то что Execute есть метод базового класса, который ты вправе использовать как наследуемый.
Но поскольку он виртуальный (читай про полиморфизм в ООП), да к тому же еще и абстрактный, то ты обязан перекрыть его в своем наследнике, о чем вполне вразумительно написано даже в стандартной справке. В противном случае ты получаешь теми самыми граблями - EAbstractError
mss вне форума Ответить с цитированием
Старый 14.03.2011, 16:47   #7
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

Осспадя, застрелиться мне что ли...
Добавил я
Код:
procedure Execute(StaticN: array of integer); override;
мне компилятор пишет : Declaration differs from previous
Не догоняю - это первое объявление, что теперь я не доделал?

upd - оно отличается от родительского что ли? Как мне сделать то лучше если я бы хотел этой процедуре всё же передавать данные?

Последний раз редактировалось BoozZzilla; 14.03.2011 в 16:50.
BoozZzilla вне форума Ответить с цитированием
Старый 14.03.2011, 16:53   #8
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
это первое объявление
Это с какого же перепугу ?
Первое объявление - он у предка, т.е. у TThread ..

Может все-таки отложить на время свою бурную писательскую деятельность и серьезно углубиться в чтение теории ?
Три кита ООП - инкапсуляция, наследование, полиморфизм ..
А то ведь анекдот про чукчу напрашивается) ..

Цитата:
оно отличается от родительского что ли?
Ты исходники-то TThread открой)

Последний раз редактировалось mss; 14.03.2011 в 16:59.
mss вне форума Ответить с цитированием
Старый 14.03.2011, 16:58   #9
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

ну хорошо
хочеться же всегда скорейскорейскорей
пойду читать
BoozZzilla вне форума Ответить с цитированием
Старый 14.03.2011, 17:00   #10
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
хочеться же всегда скорейскорейскорей
"скорейскорей" - эт только у кроликов)
mss вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
числа с плавающей точкой cleversleazoid Общие вопросы C/C++ 5 30.12.2010 00:43
Точкой и запятая! budda999 Microsoft Office Excel 6 18.08.2010 15:05
Полином Ньютона пятой степени (Visual C++) mezo Помощь студентам 1 09.06.2010 14:17
После пятой цифры макрос должен ставить дефис Manonia Microsoft Office Excel 4 22.03.2010 10:15
помогите с плавающей точкой Egory4 Помощь студентам 5 01.11.2009 14:48