자, 여기에 거래가 있습니다. GUI 어플리케이션인데 GUI가 없는 어플리케이션을 만들려고 합니다. 따라서 어플리케이션이 실행되면 로그인 화면이 있는 작은 형식이 있습니다(이 부분은 제가 완료했습니다). 이것은 양식이 실행되는 main()에 대한 코드인데 양식이 닫히는 대로 폐기합니다. 자, 여기에 거래가 있습니다. GUI 어플리케이션인데 GUI가 없는 어플리케이션을 만들려고 합니다. 따라서 어플리케이션이 실행되면 로그인 화면이 있는 작은 형식이 있습니다(이 부분은 제가 완료했습니다). 이것은 양식이 실행되는 main()에 대한 코드인데 양식이 닫히는 대로 폐기합니다.
static void Main(){ 어플리케이션입니다. VisualStyles(); 애플리케이션을 활성화합니다. 호환성을 설정합니다. TextRendering Default(false);//form1 Form1 form1 = new Form1(); 응용 프로그램의 인스턴스를 만듭니다. if(form1.isLogged) 을 실행합니다 In){ filename = Path です. 콤바인(환경)입니다. FolderPath(System) 을 취득합니다. 환경입니다 특수폴더입니다. Common Application Data(공통 애플리케이션 데이터), DateTime 입니다. 今.ToString(“dd”) ですMMyhhmm”) + “-” + form1.username); Flow palm = newFlow(newFlowArguments(form1.username, filename)); 메시지 상자입니다. show(“감사합니다, 종료..”); 폼 1입니다. dispose()}을 클릭합니다 static void Main(){ 어플리케이션입니다. VisualStyles(); 애플리케이션을 활성화합니다. 호환성을 설정합니다. TextRendering Default(false);//form1 Form1 form1 = new Form1(); 응용 프로그램의 인스턴스를 만듭니다. if(form1.isLogged) 을 실행합니다 In){ filename = Path です. 콤바인(환경)입니다. FolderPath(System) 을 취득합니다. 환경입니다 특수폴더입니다. Common Application Data(공통 애플리케이션 데이터), DateTime 입니다. 今.ToString(“dd”) ですMMyhhmm”) + “-” + form1.username); Flow palm = newFlow(newFlowArguments(form1.username, filename)); 메시지 상자입니다. show(“감사합니다, 종료..”); 폼 1입니다. dispose()}을 클릭합니다
그래서 폼이 닫힌 후에도 메인은 로그인된 상태로 계속 유지되는 것을 볼 수 있습니다. 자세히 보시면 생성된 Flow 클래스 인스턴스가 있습니다. 이것은 매우 짧은 클래스로 다음과 같이 진행합니다. 그래서 폼이 닫힌 후에도 메인은 로그인된 상태로 계속 유지되는 것을 볼 수 있습니다. 자세히 보시면 생성된 Flow 클래스 인스턴스가 있습니다. 이것은 매우 짧은 클래스로 다음과 같이 진행합니다.
public class Flow {//global variables FlowArguments FlowArgs; System; グローバル変数です。スレッド化します。tm;//construct または publicFlow(FlowArguments fmg){ FlowArgs = fmg; tm = new System をタイマーします。スレッド化します。タイマー(チック、ヌル、システム)です。スレッド化します。タイムアウトです。Infinite、10000); (StreamWriter sw = new StreamWriter(FlowArgs) を使用します。ファイル名)){//sw.writelines で、SO はあまり気にしません。 }//timer tm を有効にします。(0, 100);}public void Tick(object State){Console を変更します。WriteLine(“Hello”);//SO が気にしない SteamWriter の書き込み行メソッドの束です。}public void WriteProcesses(StreamWritersw、DateTimedw){var localAll = プロセスを無効にします。Processes() を取得します。where (o =>o) です。プロセス名です。ToLower() != “svchost”);foreach(localAll){sw のプロセス p です。Line(“@” + p) を書き込みます。プロセス名 +”[“] + dw です。ToString(“dd”) ですMyhhhmm”) + “]” + “[” + FlowArgs” です。ユーザー名 + “]);}}} public class Flow {//global variables FlowArguments FlowArgs; System; グローバル変数です。スレッド化します。tm;//construct または publicFlow(FlowArguments fmg){ FlowArgs = fmg; tm = new System をタイマーします。スレッド化します。タイマー(チック、ヌル、システム)です。スレッド化します。タイムアウトです。Infinite、10000); (StreamWriter sw = new StreamWriter(FlowArgs) を使用します。ファイル名)){//sw.writelines で、SO はあまり気にしません。 }//timer tm を有効にします。(0, 100);}public void Tick(object State){Console を変更します。WriteLine(“Hello”);//SO が気にしない SteamWriter の書き込み行メソッドの束です。}public void WriteProcesses(StreamWritersw、DateTimedw){var localAll = プロセスを無効にします。Processes() を取得します。where (o =>o) です。プロセス名です。ToLower() != “svchost”);foreach(localAll){sw のプロセス p です。Line(“@” + p) を書き込みます。プロセス名 +”[“] + dw です。ToString(“dd”) ですMyhhhmm”) + “]” + “[” + FlowArgs” です。ユーザー名 + “]);}}}
보시다시피 타이머를 시작합니다. 하지만 이것은 System. Threading.Timer를 사용하기 때문에 (Form.Timer가 실제로 적절하지 않다는 것을 어디선가 읽었기 때문에) 스레드 풀에서 실행되지만 (MSDN에 의해서) 이것이 발생하는 동안 기본 양식은 이제 Main() 따라서 프로그램이 닫힙니다. 가능한 해결책은 무엇인가요? 이 타이머는 10분마다 실행됩니다(프로세스 파악). GUI를 닫은 후 사용자가 프로그램을 닫기 위해 사용할 수 있는 시스템 아이콘 트레이를 만들 계획입니다. 전경 스레드를 대기시키려면 WaitHandle을 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx 보시다시피 타이머를 시작합니다. 하지만 이것은 System. Threading.Timer를 사용하기 때문에 (Form.Timer가 실제로 적절하지 않다는 것을 어디선가 읽었기 때문에) 스레드 풀에서 실행되지만 (MSDN에 의해서) 이것이 발생하는 동안 기본 양식은 이제 Main() 따라서 프로그램이 닫힙니다. 가능한 해결책은 무엇인가요? 이 타이머는 10분마다 실행됩니다(프로세스 파악). GUI를 닫은 후 사용자가 프로그램을 닫기 위해 사용할 수 있는 시스템 아이콘 트레이를 만들 계획입니다. 전경 스레드를 대기시키려면 WaitHandle을 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx
감사합니다。 이게 제게 필요한 거라서 이게 제가 구현한 거예요. 감사합니다。 이게 제게 필요한 거라서 이게 제가 구현한 거예요.
if(form1.는 로그에 기록되어 있습니다) In) {// UI 스레드의 대기핸들을 작성합니다. AutoResetEvent hold = new AutoResetEvent(false); 파일명 = 패스입니다. 콤바인(환경)입니다. FolderPath(System) 을 취득합니다. 환경입니다 특수폴더입니다. Common Application Data(공통 애플리케이션 데이터), DateTime 입니다. 今.ToString(“dd”) 입니다 MMyhhmm”) + “-” + form1.username); Flow palm = new Flow(new Flow Arguments(form1.username, filename), hold); // 배경 스레드가 종료될 때까지 기다립니다. 유지하겠습니다. Wait One(타임아웃)입니다. 무한합니다); 메시지 상자입니다. show(“감사합니다, 종료..”); 폼 1입니다. dispose();}를 클릭합니다 if(form1.는 로그에 기록되어 있습니다) In) {// UI 스레드의 대기핸들을 작성합니다. AutoResetEvent hold = new AutoResetEvent(false); 파일명 = 패스입니다. 콤바인(환경)입니다. FolderPath(System) 을 취득합니다. 환경입니다 특수폴더입니다. Common Application Data(공통 애플리케이션 데이터), DateTime 입니다. 今.ToString(“dd”) 입니다 MMyhhmm”) + “-” + form1.username); Flow palm = new Flow(new Flow Arguments(form1.username, filename), hold); // 배경 스레드가 종료될 때까지 기다립니다. 유지하겠습니다. Wait One(타임아웃)입니다. 무한합니다); 메시지 상자입니다. show(“감사합니다, 종료..”); 폼 1입니다. dispose();}를 클릭합니다
보시는 것처럼 AutoReset Event 참조(MSDN Timer Class 예제에서)를 Flow 클래스 작성자에게 전달합니다. 거기에서 “set” 메소드를 호출해, 대기중의 스레드를 해제할 수 있습니다. 지금은 이해할 수 있어요. 그러나 보시는 것처럼 AutoReset Event 참조(MSDN Timer Class 예제에서)를 Flow 클래스 작성자에게 전달합니다. 거기에서 “set” 메소드를 호출해, 대기중의 스레드를 해제할 수 있습니다. 지금은 이해할 수 있습니다. 하지만
hold. Wait One (타임아웃). 무한); hold. Wait One (타임아웃. 무한);
무한의 시간을 기다리겠습니다.Flow클래스에 “명령”을 송신하고 타이머를 중단하고 UI스레드가 종료할 수 있도록 waithandle에서 “set”메소드를 호출하고 싶습니다.”신호”를 보내는 방법..주의:시스템 트레이 아이콘을 어디에 두느냐를 결정하지 않습니다.그러므로 Flow클래스에 넣는 것이 간단하다면 그럴 거예요.
모든 스레드 엔트리를 삭제하고 시스템 트레이 아이콘을 구현하는 형식으로 모든 작업을 수행하십시오. 타이머를 그 형태로 넣으면 원하는 모든 것이 완료됩니다. 같은 것 모든 스레드 엔트리를 삭제하고 시스템 트레이 아이콘을 구현하는 형식으로 모든 작업을 수행하십시오. 타이머를 그 형태로 넣으면 원하는 모든 것이 완료됩니다. 같은 일
LoginForm 로그인 = newLoginForm();if(로그인)の結果。 ShowDialog()== 대화 アプリケーション。実行 OK){ アプリケーション。実行(new SystemTrayForm();} LoginForm 로그인 = newLoginForm();if(로그인)の結果。 ShowDialog()== 대화 の結果。 OK){ アプリケーション。実行(new SystemTrayForm();}