문제

자동 사원 기능을 추가하기 위해 Xournal 코드를 해킹했습니다. 나의 초기 구현은 매우 멍청했다. 기능은 표면적으로 작동합니다.

그러나 잠시 동안 테스트 한 후, 자동 판매가 실행되면 응용 프로그램이 일시적으로 동결되어 펜 스트로크 중에 있다면 상당히 성가신 것입니다. 나는 이것을 고치는 방법을 알아 내려고 노력하고 있습니다.

내가 생각한 한 가지 가능성은 AutoSave가 Autosaving 전에 펜이 화면에 닿는 지 여부를 확인하는 것입니다. 만지면 펜을 들어 올린 후 한 번만 예약 된 콜백 만 한 번만 부착하십시오. (같은 일이 발생하면 반복하십시오). 또 다른 가능성은 간격이 없도록 저장 기능을 충분히 최적화하는 것입니다 (가능성이 낮은 것 같습니다).

누구든지 이것에 대한 제안이 있습니까? Xournal은 그놈/gtk 툴킷을 사용하고 C로 작성되었습니다.

업데이트: 나는 반 클로버 논리를 구현했으며, 그 결과 자동 저장 세분화와 성능에 매우 만족합니다. 그 중 하나는 실이 (고맙게도) 필요하지 않습니다! 귀하의 제안에 감사드립니다.

도움이 되었습니까?

해결책

UI가 눈에 띄는 기간 동안 얼어 붙으면 별도의 스레드가 갈 수있는 방법 일 것입니다. UI 동결을 알아 차리는 유일한 이유는 당시에 글을 쓰고 중단이 매우 간단하기 때문에 방법이 작동하기 때문입니다. 당신의 수정은 아마도 다른 스레드를 만드는 것보다 훨씬 쉬울 것입니다. 따라서 먼저 시도하십시오.

스레드를 사용하는 경우 gtk+를 사용하기 때문에 pthreads 대신 g_threads로 이동하십시오. 그들은 더 휴대가 될 것입니다.

다른 팁

스레드를 사용하는 것이 "올바른"텍스트 상자 답변이라는 데 동의하지만 항상 일을 해야하는 방식은 아닙니다. 멀티 스레딩은주의를 기울이지 않으면 많은 문제를 일으키는 경향이 있습니다. 여기의 주요 제품은 아마도 자동 저장 기간 동안 데이터에 대한 액세스를 잠그고있을 것입니다. 그런 다음 기본 스레드가 데이터에 액세스하기 위해 대기에 들어가면 시작한 곳으로 돌아갑니다. 그러면 보류중인 변경 또는 무언가의 대기열을 만들고 무슨 일이 일어나고 있는지 추적을 잃게됩니다. 기본 데이터 구조가 얼마나 복잡한 지에 따라 사본을 만들면 기본 스레드가 동결 될 수 있습니다.

어쨌든 요점은 첫 옵션을 시도 할 것입니다. 빠르고 단순하며 요점에 이르기까지 왜 작동하지 않는지 모르겠습니다.

(참고 : 나는 Xournal의 후드를 보지 않았으므로 소금 한 덩어리 또는 소금 셰이커로 가져 가십시오. 또는 무언가)

자동 저장 기능을 별도의 스레드로 푸시 할 수 있습니까? 두 번째 스레드에서 실행하면 GUI와 병렬로 저장을 실행하고 동결 창을 피할 수 있습니다.

나는 C에 대한 경험이 거의 없지만 생각할 것입니다. 이 지역 도움이 될 수 있습니다.

나는 과거에 비슷한 상황을 겪었고 여기에 내가 그것을 해결하는 방법 (.net)은 다음과 같습니다.

  1. x 초 간격으로 배경 타이머 진드기
  2. 진드기에서 타이머를 비활성화하고 적절한 이벤트를 처리하십시오.
  3. 이벤트 핸들러에서 타이머를 저장하고 활성화하십시오.

우리가 실제로 보았던 유일한 결함은 이벤트 핸들러가 호출되기 전에 앱을 죽이고 1 분 분량의 작업을 잃는 사람이었습니다.

이건 어때?

콜백 아이디어를 사용하지만 60 초마다 10 개의 입력을 실행하도록하십시오. 시간 기반 자동 저장을 사용하면 손실되는 물건의 양이 사용자가 얼마나 빨리 작동 할 수 있는지에 비례한다는 문제가 있습니다.

한 걸음 더 나아가려면 전체 저장 외에 모든 변경 후에 디스크에 부분 취소 로그를 디스크에 저장해야합니다. 그렇게하면 충돌로 인해 발생할 수있는 최악의 일은 마지막 입력 뇌졸중을 잃는 것입니다.

내 초점은 일부 해시 알고리즘을 통해 비교하는 Hipervisor 스레드를 사용하여 변경 이벤트의 NECS마다 파일 내용을 다음 스레드에 알리고 AutoSave 기능을 콜백하는 것입니다.

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