Diskuze: Proces na pozadí
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 31 zpráv z 31.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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);
}
No to umím, ale mně jde o to, aby to běželo někde na pozadí.
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.
Tak si vytvoř novou aplikaci, tohle tam spust a celou jí zneviditelni.
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í.
Nějak nechápu důvod, proč tohle nenarveš přímo do té aplikace, která se má updatovat?
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
.
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.
Přesně to bych potřeboval, ale já ještě navíc potřebuji vyvolávat GUI, když chce uživatel.
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.
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.
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
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?
Hned jak se zapne aplikace => konstruktor, onload metody... Nevíme v čem to děláš.
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...
Díky, už to chápu. Přesně tohle jsem od začátku potřeboval
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?
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.
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.
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í
A nepomohlo by ti třeba toto: http://www.itnetwork.cz/…mu-po-startu ?
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...
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ář.
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.
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.
Named pipes, Mutex, TCP, Windows messages,... možností je spousta
Zobrazeno 31 zpráv z 31.