IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:26.6.2014 14:02

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
the cake is a lie
Avatar
Odpovídá na Petr Čech
Luboš Běhounek Satik:26.6.2014 14:12

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
https://www.facebook.com/peasantsandcastles/
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Čech
Jan Vargovský:26.6.2014 14:18
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
Petr Čech
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Petr Čech:26.6.2014 14:20

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
the cake is a lie
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Petr Čech:26.6.2014 14:25

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
the cake is a lie
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Čech
Jan Vargovský:26.6.2014 14:25

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

 
Nahoru Odpovědět
26.6.2014 14:25
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Petr Čech:26.6.2014 14:28

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
the cake is a lie
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Čech
Jan Vargovský:26.6.2014 14:29

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

 
Nahoru Odpovědět
26.6.2014 14:29
Avatar
Odpovídá na Petr Čech
Luboš Běhounek Satik:26.6.2014 14:32

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
https://www.facebook.com/peasantsandcastles/
Avatar
Petr Čech
Tvůrce
Avatar
Petr Čech:26.6.2014 14:32

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
the cake is a lie
Avatar
Odpovídá na Petr Čech
Luboš Běhounek Satik:26.6.2014 14:53

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
26.6.2014 14:53
https://www.facebook.com/peasantsandcastles/
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Petr Čech:26.6.2014 18:30

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
the cake is a lie
Avatar
Odpovídá na Petr Čech
Luboš Běhounek Satik:26.6.2014 18:36

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
https://www.facebook.com/peasantsandcastles/
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Petr Čech:26.6.2014 19:25

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
the cake is a lie
Avatar
Luboš Běhounek Satik:26.6.2014 19:34

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
https://www.facebook.com/peasantsandcastles/
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Petr Čech:26.6.2014 19:45

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
the cake is a lie
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Čech
Jan Vargovský:26.6.2014 19:52

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
Luboš Běhounek Satik:26.6.2014 20:11

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
https://www.facebook.com/peasantsandcastles/
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Petr Čech:26.6.2014 20:45

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

Nahoru Odpovědět
26.6.2014 20:45
the cake is a lie
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Petr Čech:27.6.2014 15:25

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
27.6.2014 15:25
the cake is a lie
Avatar
Odpovídá na Petr Čech
Luboš Běhounek Satik:27.6.2014 15:38

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
https://www.facebook.com/peasantsandcastles/
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Čech
Jan Vargovský:27.6.2014 19:23

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
Petr Čech
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Petr Čech:27.6.2014 19:30

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

Nahoru Odpovědět
27.6.2014 19:30
the cake is a lie
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Petr Čech:1.7.2014 11:32

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
the cake is a lie
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
Michal Štěpánek:1.7.2014 12:48

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
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
Luboš Běhounek Satik:1.7.2014 13:10

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
https://www.facebook.com/peasantsandcastles/
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Petr Čech:1.7.2014 15:36

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
the cake is a lie
Avatar
Odpovídá na Petr Čech
Luboš Běhounek Satik:1.7.2014 15:45

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
https://www.facebook.com/peasantsandcastles/
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Petr Čech:1.7.2014 16:42

No dobře, a jak jí dám vědět? o_O

Nahoru Odpovědět
1.7.2014 16:42
the cake is a lie
Avatar
Odpovídá na Petr Čech
Luboš Běhounek Satik:1.7.2014 16:55

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

Nahoru Odpovědět
1.7.2014 16:55
https://www.facebook.com/peasantsandcastles/
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.