Kod nie wykonuje się.

0

private: System::Void button1_Click(System::Object sender, System::EventArgs e) {

time_t czas = time(0);
label2->Text = (gmtime(&czas)->tm_hour + 1).ToString() + ":" + (gmtime(&czas)->tm_min).ToString() + ":" + (gmtime(&czas)->tm_sec).ToString() ;

  Sleep(Decimal::ToInt32(numericUpDown1->Value) * 60000);
system("shutdown /s");

}

Klikam buton i wykonuje się sleep, czasu nie widac.

1

Ten sleep nie może tam być. Blokujesz wątek odpowiedzialny za GUI, dlatego nie widzisz zmiany napisu w label'u. Stwórz i odpal timer zamiast tego sleep'a. W event'cie timera wrzuć to system i wyłącz timer.

1

Już nie mówiąc o tym, że wcale nie jest powiedziane, że wątki .NET są tym samym, co wątki Windowsa. Akurat w tym przypadku tak jest (póki co), ale jest to czyste implementation-specific i może się to kiedyś zmienić. Implementacje CLR, które korzystają tylko i włącznie z jednego systemowego wątku już istnieją (.NET Micro Framework).

Nie powinno się w tym przypadku mieszać native i .NET. Pracując na wątkach w GUI .NET, używaj rzeczy od wątków, które należą do .NET.

0
byku_guzio napisał(a)

Ten sleep nie może tam być. Blokujesz wątek odpowiedzialny za GUI, dlatego nie widzisz zmiany napisu w label'u. Stwórz i odpal timer zamiast tego sleep'a. W event'cie timera wrzuć to system i wyłącz timer.

Może ty napiszesz? Właśnie nie chciało mi się trochę odwalac takiej roboty i nie bardzo wiem jak zrobic event'a.

To z netu:

class timer {
private:
unsigned long begTime;
public:
void start() {
begTime = clock();
}

	unsigned long elapsedTime() {
		return ((unsigned long) clock() - begTime) / CLOCKS_PER_SEC;

	}

	bool isTimeout(unsigned long seconds) {
		return seconds >= elapsedTime();
	}

};

Chyba lepiej w konstruktorze klasy zrobic wykonanie funkcji system.

w ogóle system można wywołac osobno i nie mieszac go do licznika. Licznik odliczy i tyle.

Jaki to miałby byc event?

1 użytkowników online, w tym zalogowanych: 0, gości: 1