Vypnutí / restart   zodpovězená otázka

VB.NET

Zdravím.

Mám smyčku, na konci smyčky 5 vteřinovou pauzu (sleep(5000)), potom opakování. Program běží jako "Windows Service". Jak se vyhnu tomu, aby Windows při odhlašování / vypínání PC zobrazoval klasický dialog pro ukončení aplikace, která neodpovídá (dá se přenastavit interval ukončení všech aplikací v registrech, to vím, ale nechci použít)? Jak případně odchytit událost ukončení / restartu Windows (v rámci ukončení / restartu by měl program provést další akci). Díky za radu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Řešte příčinu, ne důsledek. V tomto případě to naprosto zhovadělé čekání pomocí Sleep. Sleep by mělo být v budoucích verzích Frameworku zakázáno, protože ho 99% lidí používá naprosto zbytečně jako nouzové řešení něčeho.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

A nedalo by se napsat třeba :" .... naprosto nevhodné čekání programu na Sleep ?"

Občas mám na diskuzích pocit (a platí to obecně pro mnoho českých fór), že čím větší hrubián, tím větší odborník. Nic proti odbornosti p. Linharta, připadá mi tak trochu jako profesionální řidič kamionu, který za volantem řve na důchodce v trabantu, který se také snaží někam dojet. Ne všichni jsme profesionálové, ne všichni se dokážeme prokousat obludně rozsáhlou dokumentací na MSDN. Co pro někoho může být nepřekonatelným problémem, je pro kované profíky naprostá blbina. A k tomu přeci fóra jsou. K předávání zkušeností. Vážený pane Linhart, zkuste se někdy tedy zamyslet, než-li okomentujete kvalitu našich laických dotazů. Možná jsou to pro vás blbiny, ale pro nás laiky jsou to pořád dotazy. Do prdele !!!!

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Až si pofoukáte bebínko, které jsem vám způsobil, tak zkuste napsat něco k věci. Jste zbytečně emocionální a na to je dobrý Lexaurin.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Pan Linhart by se mohl trochu krotit, na druhou stranu si to alespoň lépe zapamatujete a tentokrát zase nic tak strašného nenapsal (jediné ostřejší slovo je zhovadělost).

Aktivní čekání pomocí Sleep je špatné, mělo by se to řešit jiným způsobem, například pomocí událostí.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji náčelníku, že jsi se mě zastal !

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Já bych byl za to, abychom založili FUN CLUB Ondřeje Linharta !

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A já bych byl pro to uzavřít toto vlákno, protože kromě zvyšování míry nasranosti tohoto fóra se zde nic konstruktivního neprobírá.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím.

Na úvod bych chtěl podotknout, že já jsem ve VB úplný začátečník.

Ta rada, že by se čekání mělo místo "Sleep" řešit pomocí událostí je sice fajn, ale jak na to. To jsem se tu nedočetl. :-)

Vyrobil jsem si jednoduchý prográmek (můj první), od kterého očekávám, že mi bude "číhat" někde na pozadí, a když dostane "nějaký" podnět z vnějšku (po síti), provede PrintScreen a uloží jej "někam" do souboru. (Ten já si obratem zase po síti stáhnu). Toť vše.

Většinu kódu jsem vlastně opsal právě z rad těch, kteří už VB umí. Až na to dálkové spouštění. Pokud používám naprosto diletantské metody, tak se omlouvám, ale lépe to zatím neumím.

Program mi funguje skoro přesně tak, jak chci. Spustím jej automaticky po startu. Není nikde vidět, jen ve spuštěných procesech. CPU nijak nezatěžuje. Až na okamžik, kdy se stahuje a ukládá ten printscreen. Ale to není tak často, a je to v pohodě. Ani paměť se po záměně "Dim" za "Using" nijak neplní. Ale právě při pokusu o restart, či vypnutí PC, zůstane program "viset". Jak jsem se dočetl, právě pro pravidelné "vytuhnutí" při "Sleep".

Poradíte mi prosím co s tím. Nejdůležitější pro mne je, aby prográmek co nejméně zatěžoval PC. Jde o řídící systémy strojů, a ty mají dost starostí se svými aplikacemi.

Předem díky za radu.

A tady je ten můj paskvil....

Public Class Form1
    Private Sub MyBase_load() Handles MyBase.Load
        Me.Hide()
        Dim Fso As Object
        Fso = CreateObject("Scripting.FileSystemObject")
        On Error Resume Next
Znovu:
        'PrintScreen se spustí po zjištění, že se v určité složce objevil určitý soubor, zaslaný tam po síti.
        If Fso.FileExists("D:\Obrazovka\Scr.set") Then
            'Specifikuje primární obrazovku (v případě systému s více monitory)
            With Screen.PrimaryScreen.Bounds
                'Vytvořit bitovou mapu v paměti požadované velikosti
                Using bmp As New Bitmap(.Width, .Height, Imaging.PixelFormat.Format32bppRgb)
                    'Vytvořit "kreslící plátno"
                    Using g = Graphics.FromImage(bmp)
                        'Zkopírovat obsah primární obrazovky na kreslící plátno
                        g.CopyFromScreen(0, 0, 0, 0, New Size(.Width, .Height))
                        'Uložit bitovou mapu do souboru
                        bmp.Save("D:\Obrazovka\Scr.jpg", Imaging.ImageFormat.Jpeg)
                    End Using
                End Using
            End With
            'Po uložení obrázku se smaže soubor, jehož existence PrintSceen spustila.
            Kill("D:\Obrazovka\Scr.set")
        End If
        Threading.Thread.Sleep(1000)
        GoTo Znovu
    End Sub
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pár připomínek:

1) Pro práci se soubory není vhodné používat Scripting.FileSystemObject, pro zjištění existence souboru je funkce System.IO.File.Exists.

2) Pro mazání souborů je zase lepší použít funkci System.IO.File.Delete, funkce Kill i FSO jsou přežitky ze starých verzí VB a je rozumné se jim vyhnout.

3) Místo nekonečné smyčky, která je mimochodem řešená velmi neotřele, většinou se udělá cyklus While True ... End While, můžete na formulář přidat komponentu Timer, nastavit jí interval 1000 a celé screenshotování dát do události Timer1_Tick. Tím pádem vám proces nevyhnije a nebude se tvářit, jako že se zasekl. Mělo by to jít i bez problémů vypnout a neměl by zůstat viset.

4) Výjimky se chytajéí přes Try...Catch a ne zastaralým On Error Resume Next.

5) Protože screenshotování závisí na příchodu nového souboru do nějaké složky, bude lepší než timer pro tento účel použít komponentu FileSystemWatcher a nastavit ji tak, aby spustila proceduru v případě, že do dané složky nějaký soubor přibude. Ještě lepší by bylo udělat komunikaci po síti, třeba přes Windows Communication Foundation, ale to je pro tento účel možná až zbytečně složité.

Píšu to sem hlavně proto, aby to neopsal ještě někdo další. Je jasné, že začátečník loví rozumy kde se dá a najde kód pro starší verze, který bohužel funguje i ve verzích nových a pak je v tom neskutečný nepořádek.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Díky za rady. Vypadá to, že jsem ten svůj výtvor nenazval paskvilem nadarmo.

Veškeré mé zkušenosti s VB pramení pouze a jedině z několikaletého používání VBA, od MS Access 2.0 až doteď V podstatě jsem se zabýval jen databázovou aplikací.

Pokud chci vytvořit taky něco jiného, budu se muset začít učit tak trošku od základů.

V každém případě ještě jednou díky za pár tipů. Zkusím to podle nich trošku "poopravit" :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je teda rada za všechny drobný.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Naprostý souhlas s p. Linhartem. Této konstrukci se snažte vyhnout jako čert kříži a pokuste se to předělat na eventy. Nicméně pokud jinak nedáte a toužíte po uspávání vlákna, zkuste před startem vlákna tohle : (mimo jiné, někde zde na diskuzích se to již řešilo)

thr.IsBackground = True
thr.Start()

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback