Diskuze: Proces na pozadí

C# .NET .NET (C# a Visual Basic) Proces na pozadí American English version English version

Avatar
Petr Čech (czubehead):

Ahoj, mám WPF aplikaci, ve které je třída User s metodou Sync() a událost Synced. Potřeboval bych, aby se po spuštění spustila nějaká služba, co bude třeba každých 10 min stahovat data a když zjistí, že je něco nového, tak zobrazí nové okno, kde to bude vypsané. Jo a ještě je tam normální GUI. Co bych měl použít? Napadlo mě udělat 2 různé appky, ale to je asi prasárna...

Odpovědět 26.6.2014 14:02
Why so serious? -Joker
Avatar
Odpovídá na Petr Čech (czubehead)
Luboš Běhounek (Satik):

Ze služby nelze spouštět GUI aplikace (resp. to hackem teoreticky jde, ale...).

Asi nejlepším řešením je mít službu, která kontroluje aktuálnost těch dat a k tomu GUI aplikaci, co se spustí po startu Windows a je schovaná (byla by slušnost dát ji třeba dolů do lišty k hodinám, aby ji bylo možné vypnout).
Pokud jsou připravena nová data, dá služba aplikaci nějak vědět - buďto třeba přes TCP nebo přes windows message.

Nahoru Odpovědět 26.6.2014 14:12
:)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
Jan Vargovský:
new System.Threading.Timer((o) =>
    {
        MethodToCall();
    },null, TimeSpan.Zero, TimeSpan.FromMinutes(10));

A pak nějaká tvoje metoda

private void MethodToCall()
{
    Debug.WriteLine("Called at: " + DateTime.Now);
}
Editováno 26.6.2014 14:20
 
Nahoru Odpovědět 26.6.2014 14:18
Avatar
Odpovídá na Jan Vargovský
Petr Čech (czubehead):

No to umím, ale mně jde o to, aby to běželo někde na pozadí.

Nahoru Odpovědět 26.6.2014 14:20
Why so serious? -Joker
Avatar
Odpovídá na Luboš Běhounek (Satik)
Petr Čech (czubehead):

Mně je vlastně jedno, jak to bude fungovat, jde mi jen o to, jak to udělat.
Co se týče té komunikace, tak bych docela uvítal, abys to nějak rozvedl, ještě jsem se v tom nikdy nehrabal, tak nemám nejmenšího tucha, co bych vlastně měl udělat. Btw. nešlo by, že by to spolu komunikovalo přes statickou třídu? Ono je to tož celé ve statické třídě DB.

Nahoru Odpovědět 26.6.2014 14:25
Why so serious? -Joker
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
Jan Vargovský:

Tak si vytvoř novou aplikaci, tohle tam spust a celou jí zneviditelni.

 
Nahoru Odpovědět 26.6.2014 14:25
Avatar
Odpovídá na Jan Vargovský
Petr Čech (czubehead):

To mi připadá jako dost ošklivé řešení. Kdybych nepotřeboval GUI, tak bych to provedl takhle, ale tady jde o udržení aktuálnosti dat v GUI. Když mi ukážeš, jak jakoby při spuštění aplikace jen zobrazit GUI, tak mi to připadá ideální.

Editováno 26.6.2014 14:29
Nahoru Odpovědět 26.6.2014 14:28
Why so serious? -Joker
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
Jan Vargovský:

Nějak nechápu důvod, proč tohle nenarveš přímo do té aplikace, která se má updatovat?

 
Nahoru Odpovědět  +1 26.6.2014 14:29
Avatar
Odpovídá na Petr Čech (czubehead)
Luboš Běhounek (Satik):

Jak už tu padlo, pokud nemáš nějaký konkrétní důvod k použití služby (třeba aby služba běžela pod admin právy a aplikace jen pod uživatelem), tak máš lepší to nacpat do jedné aplikace, která jednou za čas sama zjistí aktuálnost dat, tam nebudeš muset řešit žádnou meziprocesorovou komunikaci :) .

Nahoru Odpovědět 26.6.2014 14:32
:)
Avatar
Petr Čech (czubehead):

No ale já chci, aby se to samo spustilo a když nastane změna, tak aby to vyhodilo hlášku nebo okno, tohle by fungovalo jen když poběží GUI, ne? //mám dojem, že si úplně nerozumíme.

Editováno 26.6.2014 14:33
Nahoru Odpovědět 26.6.2014 14:32
Why so serious? -Joker
Avatar
Odpovídá na Petr Čech (czubehead)
Luboš Běhounek (Satik):

Pokud chceš jen program, co se sám spustí po startu počítače a každou chvíli kontroluje nějaká data na změnu a při jejich změně vyhodí hlášku, tak ti stačí obyčejná GUI aplikace, kterou hodíš do "po spuštění" a necháš ji skrytou. Uvnitř budeš třeba přes timer kontrolovat ty data a když se změní, vyhodíš hlášku.

Nahoru Odpovědět  +2 26.6.2014 14:53
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Petr Čech (czubehead):

Přesně to bych potřeboval, ale já ještě navíc potřebuji vyvolávat GUI, když chce uživatel.

Nahoru Odpovědět 26.6.2014 18:30
Why so serious? -Joker
Avatar
Odpovídá na Petr Čech (czubehead)
Luboš Běhounek (Satik):

A co ti v tom brání? :) U aplikace přece ty rozhoduješ, kdy zobrazíš GUI a kdy ho skryješ, aplikace může stále běžet.

Nahoru Odpovědět 26.6.2014 18:36
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Petr Čech (czubehead):

Dobře tak jinak: JAK to mám udělat? ještě jsem nic podobného nedělal, takže chápu, že se musíš chytat za hlavu a mlátit do stolu a křičet, co je to za debila.

Nahoru Odpovědět 26.6.2014 19:25
Why so serious? -Joker
Avatar
Luboš Běhounek (Satik):

Vytvoříš úplně normální C# aplikaci, kde si naprogramuješ funkčnost a akorát budeš schovávat/ukazovat její formulář přes Show() a Hide().

Stahování dat si hodíš to timeru a u té kontroly aktuálnosti to záleží na tom, jak to máš udělané na serveru :)

Nahoru Odpovědět 26.6.2014 19:34
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Petr Čech (czubehead):

A jak udělám to spuštění po startu? Potom se přece zobrazí GUI. A kam mám dát ten timer?

Nahoru Odpovědět 26.6.2014 19:45
Why so serious? -Joker
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
Jan Vargovský:

Hned jak se zapne aplikace => konstruktor, onload metody... Nevíme v čem to děláš.

Editováno 26.6.2014 19:52
 
Nahoru Odpovědět 26.6.2014 19:52
Avatar
Odpovídá na Petr Čech (czubehead)
Luboš Běhounek (Satik):

Nahraješ zástupce tvé aplikace do uživatelovy složky Po spuštění - tu získáš třeba přes

Environment.GetFolderPath(Environment.SpecialFolder.Startup)

nebo odkaz na tvou aplikaci zapíšeš do registrů do

HKey_Current_User\Software\Microsoft\Windows\CurrentVersion\Run

GUI se nezobrazí, pokud si upravíš Program.cs , aby se hned nezobrazil formulář.

Timer můžeš přetáhnout normálně na formulář.

Myslím, že by sis nejdřív měl projít tutoriály na C#, tohle by bylo na dlouho... :)

Nahoru Odpovědět 26.6.2014 20:11
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Petr Čech (czubehead):

Díky, už to chápu. Přesně tohle jsem od začátku potřeboval ;)

Nahoru Odpovědět 26.6.2014 20:45
Why so serious? -Joker
Avatar
Odpovídá na Luboš Běhounek (Satik)
Petr Čech (czubehead):

Jo, a kde ve WPF aplikaci seženu Program.cs? A ještě: jak potom uživatel vyvolá GUI? To se přece znova spustí ten program a bez GUI?

Nahoru Odpovědět  -1 27.6.2014 15:25
Why so serious? -Joker
Avatar
Odpovídá na Petr Čech (czubehead)
Luboš Běhounek (Satik):

Jak to je s Program.cs ve WPF netuším, to jsem nikdy nepoužíval, zkus kouknout třeba sem: http://stackoverflow.com/…-main-in-wpf

GUI vyvolá jak budeš chtít - buďto klávesovou zkratkou nebo třeba necháš u hodin oznamovací ikonu.

Program znova spouštět nemusíš, poběží pořád a prostě jen budeš schovávat a ukazovat form (okno) aplikace.

Nahoru Odpovědět 27.6.2014 15:38
:)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Petr Čech (czubehead)
Jan Vargovský:

Main se generuje sám, defaultně je v app.g.i.cs. Pokud nevyužíváš nic ve třídě App, tak jí jednoduše smaž a přidej si kdekoliv tohle

[STAThread]
public static void Main()
{
    Application app = new Application();
    MainWindow window = new MainWindow();
    app.Run(window);
}

Každopádně ani to nepotřebuješ, protože ve WPF ani nemusíš mít aktivovaný form a aplikace pořád běží (můžeš si nastavit visibilitu na hidden hned v xamlu). Máš hrozně moc možností jak to udělat.

 
Nahoru Odpovědět 27.6.2014 19:23
Avatar
Odpovídá na Jan Vargovský
Petr Čech (czubehead):

To máš vlastně pravdu, nenapadlo mě to :D

Nahoru Odpovědět 27.6.2014 19:30
Why so serious? -Joker
Avatar
Odpovídá na Luboš Běhounek (Satik)
Petr Čech (czubehead):

Promiň, že ještě otravuju, ale to potom nepůjde spustit klasicky z plochy (jako přes zástupce), připadá mi to dost nepohodlné. Napadlo mě, že bych třeba mohl udělat ještě 1 exe soubor, co bych potom strčil do té složky po spuštění a spolu by to nekomunikovalo. Ten soubor by musel umět vyvolat GUI napsané v WPF. ...ale asi nemůžu prostě udělat nový projekt a z bin/debug/app.exe to vytáhnout...ono se to potom dost často nespustí :-(

Nahoru Odpovědět 1.7.2014 11:32
Why so serious? -Joker
Avatar
Nahoru Odpovědět 1.7.2014 12:06
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
Odpovídá na Petr Čech (czubehead)
Michal Štěpánek:

Myslím, že motáš několik věcí dohromady a netušíš, jak fungují. Asi by bylo nejlepší se mrknout do zdejších tutoriálů a nastudovat základy...

Nahoru Odpovědět  +4 1.7.2014 12:48
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Petr Čech (czubehead)
Luboš Běhounek (Satik):

Proč by to nemělo jít spustit přes zástupce?
Jak už jsem psal - aplikace může běžet pořád a můžeš jen skrývat a zobrazovat její okno podle potřeby. A ideálně třeba do rohu k hodinám přidat malou ikonku, kde by to člověk mohl podle potřeby zavřít nebo otevřít to okno.

Případně můžeš i udělat to, že necháš na ploše zástupce a když to spustíš přes něj a v tu chvíli už to bude spuštěné (od startu systému), tak jen pošleš zprávu té už běžící instanci aplikace, aby zobrazila formulář.

Nahoru Odpovědět 1.7.2014 13:10
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
Petr Čech (czubehead):

Přesně to (zástupce na ploše) teď potřebuju a netuším jak to udělat. Měl jsem za to, že se dá ze zástupce jen spustit aplikace. Zdejší tutoriály, co s tím mají co dělat jsem si prošel, ale nikde není to, co bych potřeboval. Vlastně jediné, co potřebuju je nějaká událost, která aplikaci bez okna řekne, že uživatel kliknul na zástupce na ploše, resp. jakoby spouští novou aplikaci.

Nahoru Odpovědět 1.7.2014 15:36
Why so serious? -Joker
Avatar
Odpovídá na Petr Čech (czubehead)
Luboš Běhounek (Satik):

Ano, ze zástupce spustíš aplikaci, takže ji vlastně už spustíš podruhé, ale hned při startu si zjistíš, jestli už neběží a pokud ano, jen se hned vypneš a před tím dáš signál té, co běží neustále.

Nahoru Odpovědět 1.7.2014 15:45
:)
Avatar
Nahoru Odpovědět 1.7.2014 16:42
Why so serious? -Joker
Avatar
Odpovídá na Petr Čech (czubehead)
Luboš Běhounek (Satik):

Named pipes, Mutex, TCP, Windows messages,... možností je spousta :)

Nahoru Odpovědět 1.7.2014 16:55
:)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 31 zpráv z 31.