winforms 앱에서 사용자가 버튼을 두 번 클릭하는 것을 처리하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/255104

문제

저는 WinForms 앱을 개발 중이며 그 안에 사용자 정의 컨트롤이 있습니다.사용자 정의 컨트롤의 버튼은 다른 코드에서 처리할 양식까지 이벤트를 발생시킵니다.버튼 중 하나는 동시에 실행될 경우 문제를 일으키는 일부 프로세스를 시작합니다.코드에는 상태를 관리하는 논리가 있으므로 일반적으로 프로세스가 이미 실행 중인 경우 사용자는 프로세스를 실행할 수 없습니다.그러나 사용자가 버튼을 두 번 클릭하면 프로세스가 너무 빨리 두 번 시작되므로 방지하기가 어렵습니다.

이 문제를 처리하는 가장 좋은 방법은 무엇인지 궁금합니다.

클릭 이벤트에서 버튼을 비활성화하여 시작했지만 첫 번째 클릭으로 인해 버튼이 비활성화되기 전에 두 번째 클릭이 발생했습니다.코드에 다른 플래그를 설정해도 이를 포착하지 못했습니다.

이벤트를 발생시키는 코드에 일종의 동기화 잠금을 추가하는 것을 고려하고 있지만 더 나은 아이디어가 있는지 궁금합니다.

이 프로젝트는 대부분 완료되었으므로 앱을 근본적으로 다시 작성하지 않는 답변을 찾고 있습니다(예: 복합 애플리케이션 블록 구현). 하지만 이러한 아이디어도 다음 프로젝트에서 사용할 수 있으므로 자유롭게 게시해 주세요. .

도움이 되었습니까?

해결책

버튼을 비활성화하거나 귀하가하는 다른 잠금이 이벤트 핸들러에서 수행하는 / 첫 번째 / 작업인지 확인하십시오. 첫 번째 명령어 화재가 발생하기 전에 두 번의 클릭 이벤트를 줄 수 있다면 매우 놀랄 것입니다. 그러나 다른 앱으로 쇠약 해지는 매우 느린 컴퓨터에 있다면 가능하다고 생각합니다.

이 경우 깃발을 사용하십시오.

private bool runningExclusiveProcess = false;

public void onClickHandler(object sender, EventArgs e)
{
    if (!runningExclusiveProcess)
    {
        runningExclusiveProcess = true;
        myButton.Enabled = false;

        // Do super secret stuff here

        // If your task is synchronous, then undo your flag here:
        runningExclusiveProcess = false;
        myButton.Enabled = true;
    }
}

// Otherwise, if your task is asynchronous with a callback, then undo your flag here:
public void taskCompletedCallback()
{
    runningExclusiveProcess = false;
    myButton.Enabled = true;
}

여전히 두 번의 클릭을 할 수 있다면 우연히 DoubleClick 이벤트에 가입하지 않았거나 Wonky가 진행되는 것이 진행되고 있는지 확인하십시오.

다른 팁

이벤트를 두 번 처리하고 있습니까?

그래요 매우 버튼을 비활성화하기 전에 두 번째 클릭이 들어오고 있다는 사실에 놀랐습니다. 나는 당신이 이벤트를 두 번 연결하지 않도록 할 것입니다. 나는 전에 우연히 이것을했다. 그런 다음 거의 순간적으로 두 가지 이벤트를 얻게됩니다.

버튼 이벤트 핸들러가 완료 될 때까지 해당 버튼의 비활성화 플래그는 설정되지 않으며 첫 번째 클릭 뒤의 Windows 메시지 대기열에서 추가 클릭이 대기됩니다. 버튼 이벤트 핸들러가 UI 스레드를 확보하기 위해 빠르게 완료해야합니다. 이 작업을 수행하는 방법에는 여러 가지가 있지만 모두가 스레드를 산란하거나 작업자 스레드를 준비하고 자동 레지 테트를 기다리는 것을 포함합니다.

우연히 아이콘으로 버튼에 레이블을 지정하고 있습니까? 반드시 코드를 사용하여 두 프로세스를 한 번에 실행하는 것을 방지하지만 버튼이 기존 명령 버튼 (직사각형, 텍스트 레이블 만, 제기 된”표면만으로 작동하면 인간 측면에서 두 번 클릭을 줄일 수 있습니다. 딸깍 하는 소리). 그냥 생각.

버튼을 클릭하자마자 비활성화됩니다.따라서 해당 이벤트는 두 번 처리할 수 없습니다.이벤트가 처리되자마자 버튼을 다시 활성화할 수 있습니다.

최상의 일화가있는 경우 확인 된 답변이 가깝습니다. 무너 뜨리지 않은 사람들에게는 너무 많은 코드가 없어서 의미가 있습니다. 타이머와 스레드 사용에 관한 기사를 작성했으며 코드 예제는 정말 쉽게 이해하기 쉽습니다. 그것을 읽고 새로운 스레드에서 작업 프로세스를 실행하여 위의 예제에서 플래그를 설정할 수 있는지 확인하십시오.

http://www.robault.com/category/threading.aspx

사용자가 처음 클릭 한 후 버튼을 비활성화하고 작업을 시작하기 전에 버튼을 비활성화합니다. 작업이 완료되면 버튼을 다시 활성화하십시오.

클릭 이벤트에서 버튼을 비활성화하여 시작했지만 두 번째 클릭이 첫 번째 클릭으로 인해 버튼이 비활성화되기 전에 들어옵니다. 코드에서 다른 플래그를 설정하는 것도 포착하지 못했습니다.

Winforms가 본질적으로 단일 스레드가 주어지면 첫 번째 처리가 완료되기 전에 두 번째 클릭이 시작될 수는 없습니다 (새 스레드 또는 배경 작업자 등을 사용하지 않는 한).

문제를 보여주는 샘플을 보여줄 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top