Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



kiosek IExplorer, idle PC

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: kiosek IExplorer, idle PC

Autor: RadekChalupa

12:59:53 27.10.2011

No nevím, ale myslím že ta m vůbec žádný sleep být nemusí. CreateProcess
se vrátí až po vytvoření procesu a to zda ten proces se "spouští"
jakkoli dlouho nemá vliv na to čekání na handle.
Problém může být v tom, že v některých případech si ten spuštěný proces
spustí další instanci a "hned" se sám ukončí. Zkusil jsem to ve Windows
8 Preview a pokud pustím 64-bitovou verzi (v Program Files - bez (x86))
také skončí bezprostředné a nechá běžet jinou instanci...

Zkus dát do kódu výpis proces ID a ten si pak porovnat (třeba Process
Explorerem) s ID běžících instancí iexplore.exe
Nějak takhle:
CreateProcessW(L"C:\\Program Files\\Internet Explorer\\iexplore.exe",
NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
WCHAR szText[50];
_swprintf(szText, L"PID: %d", pi.dwProcessId);
MessageBoxW(NULL, szText, L"IE", MB_ICONINFORMATION);


Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, Win32 API, ATL, COM, ActiveX, C#, NET
Framework, MFC)
http://www.radekchalupa.cz

Dne 27.10.2011 8:07, do zitra napsal(a):
>
> Problém 1. ok, asi struktura StartupInfo, mrknu na to...
>
> Ad 2:
>> se evidentne bude lisit pro IE
> evidentně ne :), zkusil jsem Sleep(30000);...
>
> Ad 3: to mě netrápí... Nesundavám ho TerminateProcess...

Příspěvek zaslán emailem

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: do zitra

8:07:37 27.10.2011

Problém 1. ok, asi struktura StartupInfo, mrknu na to...

Ad 2:
[code]>se evidentne bude lisit pro IE [/code]
evidentně ne :), zkusil jsem Sleep(30000);...

Ad 3: to mě netrápí... Nesundavám ho TerminateProcess...

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: Kra

17:49:39 26.10.2011

Muj (a i Radkuv) priklad funguje i pro IE v kiosk modu. To, ze nevis jak narvat parametr -k do CreateProcess je vec druha.

Co se tyce neustaleho zavirani IE, tak to je zpusobeno tim, zes ten kod nepsal a nevis, ze cas ve

Sleep (2000); //time for app to start

se evidentne bude lisit pro IE a pro kalkulacku. Kdyz tam totiz das maly cas, tak se to nestihne jeste spustit a WaitForSingleObject projde hned.

A do tretice, tvuj realny problem je, ze kdyz sestrelis IE pomoci TerminateProcess, tak te pri novem spusteni bude otravovat s hlaskou "restore last session?". Muzes ho sice ukoncit i jinym, "legalnim" zpusobem, jenze ty maji tendenci nevypinat aplikaci ve 100% pripadu (user to muze prerusit kolikrat).

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: do zitra

16:56:36 26.10.2011

Panove Chalupa a Kra děkuji za rychlé reakce, sám jsem se snažil to vvyplodit, ale narazil jsem ještě na jeden problém...

Ohledně vašich případů a komentářů, že to funguje- ano, pro calc nebo notepad to funguje, ale zkuste si dosadit do cesty "c:\\Program Files\\Internet Explorer\\iexplore.exe" a příklad Kra nefunguje. Chová se to následovně: spustí se IExplore (ignoruje parametr -k (kiosek) !!!) a po načtení celého obsahu spustí okno č.2, to pokračuje na okno č.3 a snaha restartovat...
Tedy chová se to tak, jak jsem psal v úvodu- WaitForSingleObject nečeká...

vyvíjím se trochu jiným směrem... zítra dám vědět, jak to vypadá...

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: Kra

14:05:45 26.10.2011

A kdyby bylo zadani i to udelat tak, aby to nezralo 100% CPU kdyz user pracuje a aby to nemelo 2 handle leaky za X vterin, tak si to budes muset jemne upravit ;)

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: Kra

13:51:19 26.10.2011

No a pokud bych mel napsat program dle puvodniho zadani, tedy:

[ital]Pokud uživatel 3x vypne explorer (kiosek mód, parametr -k při spuštění), restartuj pc. Pokud je PC 5 minut idle, tak nahoď v browseru homepage. [/ital]

Tak bych to udelal takto (staci vymenit cestu exace a IdleTime):

[code]
#include
#include

using namespace std;

DWORD WINAPI ThreadProc (const LPVOID ProcInfo);
void ShutDown ();

short int KillCount = 0;
const unsigned int IdleTime = 5000;

int main()
{
PROCESS_INFORMATION ProcCalc;
STARTUPINFO sInfo;

ZeroMemory (&sInfo, sizeof (sInfo));
sInfo.cb = sizeof (sInfo);
sInfo.wShowWindow = SW_SHOW;

if (!(CreateThread (NULL, 0, ThreadProc, &ProcCalc, 0, NULL)))
{
cerr << L"Thread initialization failed with: " << GetLastError() << endl;
return 1;
}

while (KillCount < 3)
{
if (!(CreateProcess (L"c:\\Windows\\System32\\calc.exe", L"", NULL, NULL, true, 0, 0, NULL, &sInfo, &ProcCalc)))
{ // process startup may fail even when CreateProcess returns success but who cares in this example...
cerr << L"App initialization failed with: " << GetLastError() << endl;
return 1;
}

Sleep (2000); //time for app to start
WaitForSingleObject (ProcCalc.hProcess, INFINITE);
KillCount++;
}


ShutDown();
return 0;
}

DWORD WINAPI ThreadProc (const LPVOID ProcInfo)
{

LASTINPUTINFO idleStruct;
idleStruct.cbSize = sizeof(idleStruct);

while (1)
{
if(!GetLastInputInfo(&idleStruct))
continue;

DWORD sysIdleTime = GetTickCount() - idleStruct.dwTime;

if (sysIdleTime > IdleTime)
{
KillCount--;
TerminateProcess (((LPPROCESS_INFORMATION)ProcInfo)->hProcess, 0);
Sleep (IdleTime);
}
}
}

void ShutDown ()
{
MessageBox (0, L"Goodbye Lenin!", L"Viva la revolucion", 0);

HANDLE hToken;
TOKEN_PRIVILEGES tkp;

OpenProcessToken (GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges (hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

if (!(ExitWindowsEx (EWX_REBOOT | EWX_FORCE | EWX_FORCEIFHUNG, SHTDN_REASON_MAJOR_APPLICATION | SHTDN_REASON_MINOR_SECURITY)))
cerr << "Shut down failed with reason: " << GetLastError() << endl;
}
[/code]

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: Kra

15:33:53 25.10.2011

[code]
#include
#include

using namespace std;

DWORD WINAPI ThreadProc (LPVOID ProcInfo);
PROCESS_INFORMATION ProcCalc;

int main()
{
do
{
if (!(CreateThread (NULL, 0, ThreadProc, &ProcCalc, 0, NULL)))
{
cout << L"Thread initialization failed with: " << GetLastError() << endl;
system ("pause");
}

Sleep (3000);
} while (WaitForSingleObject (ProcCalc.hProcess, INFINITE) == WAIT_OBJECT_0);

return 0;
}

DWORD WINAPI ThreadProc (LPVOID ProcInfo)
{
STARTUPINFO sInfo;

ZeroMemory (&sInfo, sizeof (sInfo));
sInfo.cb = sizeof (sInfo);
sInfo.wShowWindow = SW_SHOW;


CreateProcess (L"c:\\Windows\\System32\\calc.exe", L"", NULL, NULL, true, 0, 0, NULL, &sInfo, (LPPROCESS_INFORMATION) ProcInfo);
return 0;
}

[/code]

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: RadekChalupa

15:01:17 25.10.2011

Tohle mě funguje bez problémů s čekáním na ukončení:

PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
CreateProcessW(L"c:\\windows\\system32\\notepad.exe", NULL, NULL,
NULL, FALSE, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
MessageBoxW(NULL, L"Konec", L"Notepad", MB_ICONINFORMATION);

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, Win32 API, ATL, COM, ActiveX, C#, NET
Framework, MFC)
http://www.radekchalupa.cz

Dne 25.10.2011 13:03, do zitra napsal(a):
>
> potrebuju tedy tu druhou variantu, praxe ukazala, ze applikace do rana nedrzi. muzete nejak rozepsat tu verzi nad kterou uvazujete? jako detaily, ne nutne kod. o neco se tady hodiny pokousim, ale ocividne nechapu praci tech vlaken...
>
> PROCESS_INFORMATION piProcessInfo;
> main()
> {
> zavolej_vlakno_1()
> Sleep(3000)
> WaitForSingleObject(piProcessInfo.hProcess, INFINITE)
> }
> a v zavolej vlakno je:
>
> memset(&siStartupInfo, 0, sizeof(siStartupInfo));
> memset(&piProcessInfo, 0, sizeof(piProcessInfo));
> siStartupInfo.cb = sizeof(siStartupInfo);
>
> CreateProcessW(TEXT("C:\\Program Files\\Internet Explorer\\iexplore.exe"),
> TEXT("-k"), 0, 0, false,
> CREATE_DEFAULT_ERROR_MODE, 0, 0,
> &siStartupInfo,&piProcessInfo);
>
>
> takze to vlakno spusti IE a ukonci se- mela by se naplnit struktura piProcessInfo. pod vlaknem je 3s sleep a waitforsingleobject (dokud se IE neukonci)- tam ale na me vyskoci error, ze struktura piProcessInfo neni inicializovana...


Příspěvek zaslán emailem

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: do zitra

13:03:55 25.10.2011

potrebuju tedy tu druhou variantu, praxe ukazala, ze applikace do rana nedrzi. muzete nejak rozepsat tu verzi nad kterou uvazujete? jako detaily, ne nutne kod. o neco se tady hodiny pokousim, ale ocividne nechapu praci tech vlaken...
[code]
PROCESS_INFORMATION piProcessInfo;
main()
{
zavolej_vlakno_1()
Sleep(3000)
WaitForSingleObject(piProcessInfo.hProcess, INFINITE)
}
a v zavolej vlakno je:

memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);

CreateProcessW(TEXT("C:\\Program Files\\Internet Explorer\\iexplore.exe"),
TEXT("-k"), 0, 0, false,
CREATE_DEFAULT_ERROR_MODE, 0, 0,
&siStartupInfo, &piProcessInfo);

[/code]
takze to vlakno spusti IE a ukonci se- mela by se naplnit struktura piProcessInfo. pod vlaknem je 3s sleep a waitforsingleobject (dokud se IE neukonci)- tam ale na me vyskoci error, ze struktura piProcessInfo neni inicializovana...

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: do zitra :)

10:26:15 19.10.2011

je to informacni kiosek, jine aplikace tam nepobezi... ale jj, taky me tahle cesta napadla... uz to ale mam napsany a dost jsem to testoval a vypada to spolehlive. diky ale moc!

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: Kra

9:41:08 19.10.2011

Elegantnejsi by asi bylo spustit to IE pres CreateProcess a ziskany handle pouzit v jinem threadu ve WaitForSingleObject. Jakmile by se proces ukoncil, tak by se tvuj thread probudil a mohl IE znovu spustit. Zjistovani stale dokola zda IE bezi (a pritom nemusi byt vubec tvuj, treba to bude jen cast nejake jine app) neni idealni.

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: do zitra :)

9:27:35 19.10.2011

tak se mi to podarilo... kdyby nekdo hledal vlakna, tady je to krasne udelany: http://www.codeproject.com/KB/threads/Threads_1.aspx#

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: do zitra :)

7:50:28 19.10.2011

Dekuji za reakcim ten sleep se zda mi dost veci resi, ale neosetruje mi moji horni podminku, ze kdyz byl uzivatelem browser 3x vypnut, zrestartuj windows. kdyz tam dam sleep 5min, tak mi to neosetri preci: nebezi-li proces, spus ho. zrejme se nevyhnu napasanovani na vlakna. jenomze jsem s nimi jeste nedelal... :) mno uvidime...

Citovat příspěvek

 

Re: kiosek IExplorer, idle PC

Autor: Kra

20:46:06 18.10.2011

Vzhledem k tomu, kolik na to mas casu, tak to bude pekne zabugovana aplikace :P

Mas tam nekolik problemu technickych:

- SysIdleTime ma byt DWORD jinak ti to pretece (obzvlast na kiosku kde nikdy nikdo neni, GetTickCount vraci DWORD coz je na mem systemu unsigned long)
- IdleStruct.dwTime = 0;//zrejme nefunkcni -> to si pis
- Divim se, ze ti TerminateProcess funguje, protoze FindWindow ti najde handle okna a ne procesu. Na me test aplikaci to nefungovalo ani jednou. A to jsem jeste musel pouzit FindWindowA, protoze unicode verze mi kalkulacku nenasla, ale to vem cert
-

a problem logicky - co se stane jakmile se presahne ten dany idle time? No ta tvoje smycka se bude furt vykonavat, dokud nekdo nepohne mysi. Takze kdyz to nekdo od PC na 10 minut odejde, tak se ti to bude furt spoustet/vypinat (za predpokladu, ze ti TerminateProcess funguje). Rychly zpusob jak to osetrit je timeout, treba dalsi Sleep (60000); hned za to ShellExecute.

Citovat příspěvek

 

kiosek IExplorer, idle PC

Autor: dozitra :)

16:17:53 18.10.2011

Dobrý den,
firma mi zadala do zítra do 11:00 mít napsáno app, pro náš kiosek, který se tou dobou spouští. Zkouším si s tím pořád hrát a nedaří se...

Kiosek zobrazuje IEXplorer s nastavenýma webovkama. Klávesové zkratky a task manager zakázány, okno top most.

Zadání: Pokud uživatel 3x vypne explorer (kiosek mód, parametr -k při spuštění), restartuj pc. Pokud je PC 5 minut idle, tak nahoď v browseru homepage.
S druhou částí se právě peru, první již mám.

[code]
//zde mám kod jestli bezi proces iexplorer, tak pocitej promennou do tri a pak restartuj... vse ok...

checkuj();//mrkni jestli je pc 5 minut idle
Sleep(1000);
}//konec mého while
[/code]

checkuj:
[code]
LASTINPUTINFO idleStruct;// = new LASTINPUTINFO();
idleStruct.cbSize = sizeof(idleStruct);
//check if we are able to calculate time.
if(GetLastInputInfo(&idleStruct)){
int sysIdleTime = GetTickCount() - idleStruct.dwTime;

if(sysIdleTime >= 300000)//pro test dej treba 8000
{
nastav_domovskou_stranku();
idleStruct.dwTime = 0;//zrejme nefunkcni
}
}
[/code]
nastav domovskou stranku:
[code]
void nastav_domovskou_stranku(){
HWND hwnd = FindWindow(TEXT("IEFrame"), NULL);
if(hwnd){
TerminateProcess(hwnd,0);//SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0); obcas nevypne
ShellExecute(NULL, TEXT("open"), TEXT("C:\\Program Files\\Internet Explorer\\iexplore.exe"), TEXT("-k"), NULL, SW_SHOWNORMAL);
}
}
[/code]

Jakoby ten Sleep(1000) nefungoval a IExplore problikává- je stále zapínán a ukončován. Dokud někdo nezruší idle stav. Prosím o myšlenkové nakopnutí ;)

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: