2009-03-31 4 views
4

C++에서 벡터 그리기를 수행하고 sqlite를 사용하여 실행 취소/다시 실행 기능을 백업하는 데스크톱 응용 프로그램을 작성하고 있습니다.실행 취소/다시 실행 기능을 위해 sqlite를 활용하는 방법은 무엇입니까?

누구나 실행 취소/다시 실행 기능을 위해 sqlite를 사용 했습니까? 그것은 당신을 위해 어떻게 운동합니까?

명확한 설명 : 나는 스택 방식의 알고 있었다

, 나는 심지어 접근 한 응용 프로그램을 구현했습니다. 내가 만난 문제는 잠시 후에 유지하기가 어려워 졌다는 것입니다.

내가 sqlite를 사용하여 의미했던 것은 내 전체 메모리 내 데이터 구조를 sqlite 데이터베이스에 매핑하고 sqlite가 diff 및 수정본을 처리하도록합니다. 메모리 내 데이터베이스를 만들면 속도가 문제되지 않아야합니다.

그것은 아이디어 였고 나는 그것이 효과가 있는지 궁금해하고있었습니다.

+0

과장된 것처럼 보입니다. 정상적인 경계 스택/명령 패턴 접근 방식의 문제점은 무엇입니까? –

+1

http://c2.com/cgi/wiki?AbstractionInversion –

+1

나는 Pete와 동의한다. 스택 기반 접근 방식으로 시작하십시오. 그게 아니라면, 각 명령에 DB에 직렬화/역 직렬화 할 수있는 기능을 부여하십시오. 그러나 정말로, 당신이 정말로 이상한 것을하지 않는다면, 스택 기반 접근법은 그것을자를 것입니다. –

답변

10

SQLite 데이터베이스를 응용 프로그램의 데이터 파일 형식으로 사용하는 경우 실행 취소/다시 실행하기 위해 SQLite를 사용하는 것이 좋습니다. SQLite 트리거로이를 수행하는 방법에 대한 설명은 the SQLite website을 참조하십시오.

+0

명성이 15 점 이상이라면 나는이 답장을 보냈을 것이다. – lyxera

+0

GPL 라이센스 라이브러리를 사용하고 싶다면 많은 일을 한 소스 포지 프로젝트가 있습니다. (아직 사용하지는 않았지만 문서를 읽었습니다.) http://sourceforge.net/projects/sqlite-undo/에서 찾을 수 있습니다. – Eponymous

2

기본적으로 실행 취소/다시 실행 기능은 스택을 사용하여 구현할 수 있습니다. 사용자가 작업을 수행 할 때 작업 전후의 델타를 나타내는 개체를 스택에 올려 놓고 실행 취소하면 델타를 "풀다". 사용자가 수행하는 모든 작업은 스택에 새로운 델타 객체를 생성하기 때문에 너무 느릴 수 있기 때문에 sqlite는 사용자가 선택한 기술이 아닐 수도 있습니다. 실행 취소/다시 실행 정보를 메모리에 저장하고 실제로 실행 취소/다시 실행 기록을 저장하려는 경우에만 디스크에서 선형화 할 수있는 가능성을 고려하는 것이 좋습니다.

+0

반드시 그래픽 응용 프로그램을위한 최선의 방법은 아닙니다. 마지막 작업이 모든 픽셀을 검은 색으로 변경했다는 것을 알고 있으면 작업을 실행 취소하기에 충분하지 않습니다. –

+0

@mgb 당연히 아닙니다 ---하지만 어쨌든 그렇게하는 것은 아닙니다. 최적화되지 않은 구현은 픽셀의 색상을 변경하는 기본 작업을 수행합니다. 델타 오브젝트는 트리플 (X, Y, old_color)입니다. 새로운 색으로 (X, Y)를 변경하면 델타 트리플 포함을 푸시합니다. 스택에 오래 된 색입니다. 나중에 실행 취소 할 때 델타 개체를 팝업하고 이전 색을 다시 화면에 씁니다. 1000x1000 캔버스에서 모든 픽셀을 검정색으로 설정하면 1 백만 개의 델타 개체가 생성됩니다. 실제로 그래픽 프로그램은보다 최적화 된 방식으로 처리합니다. –

+0

스택을 사용하는 대신 "now"포인터가있는 큐를 사용할 수도 있습니다. 이렇게하면 실행 취소 및 다시 실행 기능을 모두 큐에서 앞뒤로 움직여 쉽게 구현할 수 있습니다. 즉, 실행 취소는 큐의 한 객체를 백업하고 다시 실행 단계를 진행하고 작업을 다시 실행합니다. – CodeFusionMobile

관련 문제