Autor Téma: Test na otevření souboru  (Přečteno 885 krát)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3004
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:Test na otevření souboru
« Odpověď #30 kdy: 13-10-2020, 19:43:08 »
Asi tomu nerozumím. Měl jsem za to, že ProcessMessages umožňuje reagovat aplikaci na nějakou akci okna, jako zavření, kliknutí na objekt a to i když běží nějaký cyklus, kde hrozí nekonečná smyčka. Ve VB to byl příkaz DoEvents.
No vsak, ale to v dusledku znamena, ze spoustis rekurzivne pumpu zprav, jak jsem se ti snazil naznacit, takze mj. narusis jejich prirozene poradi ve fronte

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #31 kdy: 13-10-2020, 21:33:56 »
Je tam ještě jedna potíž. Comport sbírá data z ústředen na této události:
Kód: Delphi [Vybrat]
  1. procedure TfrmMain.ComPort1RxChar(Sender: TObject; Count: Integer);
  2. var str: string;
  3. begin
  4. ComPort1.ReadStr(Str, Count);
  5. txtRX.Text:= txtRX.Text + str;
  6. if pos(#13, txtRX.Text)<>0 then
  7. begin
  8.   rx:=txtRX.Text;
  9.   txtRX.Text:=''; end;
  10. end;
  11.  

mercyklus čeká na 167 bytů

Kód: Delphi [Vybrat]
  1. ...
  2.                         { **** Přečtení dat z impu do stringu ****}
  3.                         rx:='';
  4.                         if i < 10 then povel:='I_SR0' + inttostr(i) + '0080' else povel:='I_SR' + inttostr(i) + '0080';
  5.                         frmmain.comport1.WriteStr(povel + #13);
  6.                         sleep(100);
  7.                         endtime:=time+0.1/(24*60*60);
  8.                         repeat
  9.                             application.ProcessMessages;
  10.                         until ((time)>endtime) or (length(rx)=167);
  11. ...
  12.  

pokud tam v té smyčce application.ProcessMessages nedám, data z portu tam nepřijdou.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5450
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Test na otevření souboru
« Odpověď #32 kdy: 13-10-2020, 21:49:30 »
OT: Nie je lepšie prerobiť
Kód: Delphi [Vybrat]
  1. 0.1/(24*60*60)
Na konštantu? Ja osobne veľmi nerád vidím podobné veci v cykoch. Je to práca navyše a úplne zbytočná.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #33 kdy: 13-10-2020, 22:09:36 »
Asi jo, ale to nic neřeší.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #34 kdy: 13-10-2020, 22:12:12 »
Nevíte někdo o konvertoru hlp na pdf, nebo chm, nejraději online, abych ho nemusel inštalovat? Comport má Help v hlp formátu a já mám desítky. Díval jsem se na webu a nic rozumnýho jsem tam neobjevil.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Online JaroB

  • Guru
  • *****
  • Příspěvků: 1010
  • Karma: 28
    • Verze Delphi: XE8, Seattle
Re:Test na otevření souboru
« Odpověď #35 kdy: 14-10-2020, 09:28:12 »
Používáte TCommPortDriver nebo TComm32? Threadovaný byl, pokud si vzpomínám, jen TComm32, možná by to posloužilo jako mustr.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3004
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:Test na otevření souboru
« Odpověď #36 kdy: 14-10-2020, 09:49:11 »
Kód: Delphi [Vybrat]
  1. ...
  2.                         { **** Přečtení dat z impu do stringu ****}
  3.                         rx:='';
  4.                         if i < 10 then povel:='I_SR0' + inttostr(i) + '0080' else povel:='I_SR' + inttostr(i) + '0080';
  5.                         frmmain.comport1.WriteStr(povel + #13);
  6.                         sleep(100);
  7.                         endtime:=time+0.1/(24*60*60);
  8.                         repeat
  9.                             application.ProcessMessages;
  10.                         until ((time)>endtime) or (length(rx)=167);
  11. ...
  12.  

pokud tam v té smyčce application.ProcessMessages nedám, data z portu tam nepřijdou.
Ano, to dela to aktivni cekani repeat-until. Tak se mozna programovalo v DOSu, ale ne v event driven prostredi. Tam zadne sleep ani cekaci smycky nemaji co delat: V dobe cekani ma bezet pumpa zprav a tvoje aplikace ma obsluhovat eventy, ktere posila. Nad tim sleep(100) by se dalo zavrit oko, ale na tim repeat-until ne.

Ty to musis invertovat tj. misto repeat-until nastartovat timer s timeoutem, ktery kdyz by ticknul, tak by ses choval jako pri prekorceni casu a naopak pri obsluze RxChar bys sis prijmal znaky a kdyz bys je mel vsechny, tak bys ten timer zastavil a ty prijate znaky co nejrychleji zpracoval ev. obslouzil to zarizeni, pokud je to treba. Tim by ti za na to zpracovani jela porad pumpa zprav a nikde bys zadne ProcessMessages nepotreboval.

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #37 kdy: 14-10-2020, 10:20:52 »
Citace
TCommPortDriver nebo TComm32
Používám TComPort od Deana Crnily.

Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #38 kdy: 14-10-2020, 10:38:16 »
Citace
Ano, to dela to aktivni cekani repeat-until....

A jak by mercyklus poznala, že data byla přijata a může pokračovat. Je to tak, že bych měl rozkouskovat mercyklus na jednotlivé obsluhy komunikace a volat je nějakou obsluhou naplnění txtRX.Text na každou příchozí komunikaci (a těch Impů = 20-ti kanálové jednotky měřicí ústředny, může jich být až 40).
A pak až po příjmu všech hodnot řešit jinde výpočty a zobrazení? To mi připadá dost komplikované a těžko laditelné.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #39 kdy: 14-10-2020, 21:39:21 »
Ještě mám jeden dotaz. Jak se dá zjistit, že existuje instance child formuláře vytvořená za běhu programu?
 
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 106
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Test na otevření souboru
« Odpověď #40 kdy: 15-10-2020, 06:47:45 »
Ještě mám jeden dotaz. Jak se dá zjistit, že existuje instance child formuláře vytvořená za běhu programu?

Projdeš si child okna a zjistíš, zda instance existuje nebo ne. Jestli máš instance, které se nevytváří za běhu a vytváří za běhu, tak je něčím odliš - třeba TAG property na formuláři.

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #41 kdy: 15-10-2020, 10:16:51 »
Díky za odpověď. Projít okna a třeba přes .Name mě napadlo, mayslel jsem, jestli to nejde přímo bez cyklu, třeba jako if frmMerení = nil, nebo tak něco..
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Test na otevření souboru
« Odpověď #42 kdy: 15-10-2020, 10:43:54 »
Děkuju všem za podněty, nakonec jsem to udělal viz citace
Citace
Nabizi se priznak, ze se meri a tim blokovat zavreni formulare v OnCloseQuery... ale jak pises, to nema s programovanim mnoho spolecneho
jenom podmínku jsen dal do OnClose viz kód
Kód: Delphi [Vybrat]
  1. procedure TfrmMereni.FormClose(Sender: TObject; var Action: TCloseAction);
  2. begin
  3.   frmMain.Timer1.Enabled:=false;
  4.   frmMain.mnuPrepocet.enabled:=true;
  5.    ...  
  6.   frmMain.mnuSnetOff.enabled:=true;
  7.   cyklus:=0;
  8.   frmMain.StatusBar1.Panels[1].Text:='IDLE';
  9.   flag_zavrit_Merform:=true;
  10.   frmMain.lbMerfile.caption:='Soubor dat:' ;
  11.   if flag_muzes_merit then Action := caFree else Action:=caNone;
  12. end;
  13.  

a v Mercyklu na konci testuji flag_zavrit_Meform, nastavim  flag_muzes_merit na true a zavřu frmMereni. Vcelku to funguje.

Nejsem žádný programátor, jsem přístrojář a technik zkřížený s problematikou kotlů, turbín a elektro, takže mi stačí, když věci dělají co potřebuju. Navíc dědka mezi šedesátkou a smrtí už moc novým kouskům nenaučíš.

Ještě jednou všem děkuju.
Dalibor.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1150
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Test na otevření souboru
« Odpověď #43 kdy: 16-10-2020, 20:21:03 »
Brrr, vzpomněl jsem si, když jsem něco takového taky používal. Přitom ty vlákna opravdu nejsou nic tak strašného.
Vyzkoušej si to na něčem malém a sám uvidíš. 60+ není překážka naučit se něco nového. Důchodci se toho učí mnohem více ...