příkaz NetTestPC a sequencer

Toto je hlavní technické fórum pro diskusi o problémech při vytváření PROMOTIC aplikací a jejich řešení.

příkaz NetTestPC a sequencer

Postby Miroslav89 » Wed 30. Sep 2015 9:06:04

Dobrý den,
Mám problém s příkazem NetTestPC. Ve skriptu testuji co 30 sekund dosažitelnost 15 access pointů:

To znamená 15x pod sebou s jinou IP adresou:
pMe.pm("/Stroje/PomData/#vars/apVV").Value = Pm.NetTestPC(3, "192.168.110.93" , 3000)

Když nejsou AP zapojena, promotic zamrzne podle délky nastaveného timeoutu - tzn. cca 15x 3000ms. Toto jsem chtěl vyřešit asynchroním zpracováním pomocí sequenceru. daný skript tedy volám takto:
V časovači co 30 sekund: TestAP.Add 0, "TestAP", , , "thread:work;"
Sequencer na událost onStep:
Select Case pEvent.Val1
Case "TestAP"
pMe.pm("/Metody").Methods.TestAP
End Select

Nastavení sequenceru: typ spouštění položek = 1
vlákno = BelowNormal
Timeout při zastavování pracovního vlákna = 10s

I přesto že je metoda vyvolána v jiném vlákně Promotic na nějakou dobu zatuhne.

Stejný problém jsem také řešil při zpracování složitých algoritmů při práci s databází SQL serveru. I přes použití sequenceru se zadrhával i běh celé aplikace.

Mohl bych tedy poprosit o radu?
Děkuji
Miroslav89
 
Posts: 6
Joined: Wed 30. Sep 2015 8:52:39

Re: příkaz NetTestPC a sequencer

Postby Tomáš Bräuer » Thu 01. Oct 2015 12:58:49

Dobrý den! Vyzkoušel jsem vámi popsanou situaci a vše funguje tak, jak má.
Test:
1) Pro testování běžící aplikace objekt PmTimer s periodou 1s a výpisem do INFO:
Pm.Debug Pm.Time
2) Sekvencer s threadem BelowNormal typu 0 nebo 1 tady na tom nezáleží a událostí onStep:
Pm.ClockStart
Pm.NetTestPC 3, "192.168.1.251" , 4000
Pm.ClockStop
3) Spuštění testování objektem PmKey např na <F2>:
Pm("/Sequencer").Add 0, "test", 0, 0, "thread:work;"

Při ping na neexistující adresu skutečně metoda Pm.NetTestPC blokuje na dobu určenou timeout hodnotou. Ale blokován je sekvencer a hlavní thread promotic jede dál, včetně ovládání uživatelského rozhraní a zobrazování INFO systému. Při opakovaném stisku klávesy se uloží do fronty série požadavků a ty jsou pak prováděny ve čtyřsekundových intervalech.

Problém je jinde. Nesmíte ze sekvenceru volat nic, co by mohlo čekat na hlavní thread a blokovat se s ním. U vás to je ještě jasnější. Všechny metody cizích objektů (xxx.Methods) jsou volány z hlavního threadu, takže promotic se tam synchronně přepne do hlavního threadu. Pokud vy jste blokující operace neudělal přímo v onStep nebo v Methods objektu PmSequencer, potom jste si tím zablokoval hlavní thread aplikace.
Všechno časově náročné a potenciálně blokující (např přístup k síťovým prostředkům) je nutno dělat přímo v onStep nebo ve verzi 8.3 i v metodě PmSequencer.Methods. Nikde jinde.
Tomáš Bräuer
Administrátor
 
Posts: 153
Joined: Thu 13. Dec 2012 9:13:13

Re: příkaz NetTestPC a sequencer

Postby Miroslav89 » Fri 02. Oct 2015 13:11:02

Aha, to vše vysvětluje. myslel jsem si, že pokud zavolám jakoukoliv metodu, bude se provádět ve vlákně sekvenceru. Tím pádem je to vyřešeno.

Děkuji za odpověď a Váš čas. :)
Miroslav89
 
Posts: 6
Joined: Wed 30. Sep 2015 8:52:39


Return to Nevím jak...

Who is online

Users browsing this forum: No registered users and 10 guests