2011-03-19 7 views
0

HI델파이 - I 독점 데이터 세트를 사용하여 데이터베이스에 액세스하는 제어 할 수 있습니다

자신의 프로세스에서 실행 컨트롤을 만들기. 데이터베이스는 오래된 ISAM 데이터베이스입니다.

컨트롤은 백그라운드 스레드를 사용하여 전용 데이터 집합을 사용하여 데이터베이스를 쿼리합니다.

폼에는이 컨트롤이 여러 개 포함되어 있으며 각 컨트롤은 각각의 스레드를 사용하여 동시에로드해야하는 데이터에 액세스합니다.

소유권이있는 데이터 세트는 VCL TForm을 표시하여 동시성을 처리하여 열려있는 테이블이 다른 사용자에 의해 잠겨져 있고 데이터 세트가 잠금이 해제 될 때까지 기다리고 있음을 사용자에게 알립니다.

양식에 취소 대기 버튼이있어 사용자가 잠금 대기를 취소 할 수 있습니다.

문제 :

스레드 내에서 독점적 인 데이터 세트를 사용하여 응용 프로그램이 충돌이 중단되거나 잠금이 표시 형성 기다리면 몇 가지 오류를 줄 것이다. 나는 이것이 스레드 안전하지 않은 VCL과 관련이 있다고 생각한다.

그러나 Dataset.Open을 동기화하여이 문제를 해결했지만 dataset.open이 반환 될 때까지 주 스레드를 유지하므로 쿼리의 복잡성에 따라 상당한 시간이 걸릴 수 있습니다.

사용자에게 진행 상황을 알리는 모달 진행률 표시 줄이 표시되었지만 사용자가 진행률 표시 줄을 기다리는 동안 앉아있을 때이 아이디어가 마음에 들지 않습니다.

독점 데이터 세트 코드는 주 응용 프로그램으로 컴파일됩니다. 즉, 별도의 DLL에 저장되지 않습니다. 우리는 잠금이 작동하는 방식이나 개발 프로세스의이 단계에서 양식이 표시되는지 여부를 변경할 수 없습니다. 출시 단계에 너무 가까워서입니다.

이상적으로는 Dataset.open을 주 스레드를 사용하는 대신 제어 스레드에서 실행하고 싶습니다. 그러나 이것은 작동하지 않는 것 같습니다.

다른 사람이 해결 방법을 제안 할 수 있습니까? 부디.

+2

당신의 질문은 나에게 의미가 없습니다. 별도의 프로세스에서 컨트롤을 만들려면 별도의 응용 프로그램에 넣습니다. 섬유는 스레드보다 VCL과 함께 사용하기에 더 이상 안전하지 않습니다. ISAM 데이터베이스의 잠금 메시지가 왜 문제가되는지는 명확하지 않습니다. VCL을 직접 사용합니까? 그렇다면 어떻게? –

+0

별도의 프로세스에서 실행되지만 다른 프로세스의 형태로 표시되는 컨트롤을 가질 수 있는지, 그리고 별도의 실행 파일없이이 작업을 수행 할 수 있는지 궁금합니다. ISAM 데이터 집합 구성 요소는 기본적으로 취소 단추가있는 TForm 인 잠금 메시지를 표시합니다. 잠금 메시지는 열려있는 테이블이 현재 다른 사용자에 의해 잠겨 있음을 사용자에게 알립니다. 사용자는 대기하거나 취소 버튼을 누를 수 있습니다. 왜 DOS 시대에 윈도우즈로 바뀌 었는지, 그리고 내가 바꿀 수없는 어떤 것의 코드가 있습니다. –

+0

하나의 상위 컨테이너 내에 다른 프로세스의 UI를 표시 할 수 있습니다. Chrome 또는 IE8을 고려하십시오. 네가 이럴 필요가 있다는 것을 나는 알지 못한다. 해당 UI가 완전히 분리되어있는 한 백그라운드 스레드에 UI를 가질 수 있습니다. 이 다른 코드가 DLL로 전달되면 문제가 발생한 이유를 알 수 없습니다. –

답변

1

섬유는 협업 멀티 태스킹을 염두에두고 작성된 이전 코드를 쉽게 이식 할 수 있도록하기 위해 Windows API에 있기 때문에 한 가지 도움이되지 않습니다. 파이버는 기본적으로 공동 루틴의 한 형태이며, 모두 동일한 프로세스에서 실행되고, 자체 스택 공간을 가지며, 이들 사이의 전환은 OS가 아니라 사용자 코드에 의해 제어됩니다. 즉, 이들 사이의 전환은 안전 할 때만 이루어 지므로 동기화 문제가 발생하지 않습니다. OTOH는 하나의 스레드 만 동시에 하나의 스레드 내에서 실행될 수 있음을 의미하므로 블록 코드가있는 파이버를 사용하면 한 스레드 내에서 블로킹 코드를 호출하는 것과 동일한 특성을 갖습니다. 즉, 응용 프로그램이 응답하지 않게됩니다.

섬유를 여러 스레드와 함께 사용할 수는 있지만 위험 할 수 있으며 스레드 단독으로 사용하는 것보다 이점이 없습니다.

나는 섬유를 VCL 응용 프로그램에서 성공적으로 사용했지만 특정 용도로만 사용했습니다. 잠재적으로 블로킹 코드를 처리하고 싶다면 잊어 버리십시오.

귀하의 문제는 - 표시 목적으로 만 사용되며 표준 프로세스 간 통신 메커니즘을 사용하여 데이터베이스에 액세스하는 다른 프로세스와 데이터를 교환하는 컨트롤을 만들어야합니다.

+0

죄송합니다 귀하의 데이터베이스에 액세스하는 다른 프로세스와 데이터를 교환함으로써 귀하가 의미하는 바를 이해하지 못합니까? 데이터베이스에 액세스하고 WM_COPYDATA를 사용하여 데이터 백을 전달하는 다른 프로세스를 만드는 것입니까 (미안, 메시지가 무엇인지 기억하지 못합니다)? 별도의 실행 파일없이이 작업을 수행 할 수 있습니까? 가상 프로세스를 만들고 어떤 코드를 실행할 때 스레드를 연결하는 것과 같습니다. –

+0

@no spoon : 자체 프로세스에서 실행되는 컨트롤에 대해 물었습니다. 프로세스는 실행 파일 (동일하거나 다른 실행 파일)을 가져야합니다. 동일한 실행 파일의 다른 인스턴스를 생성하는 경우 (명령 행 스위치를 사용하는 경우) 다른 인스턴스는 필요하지 않습니다. 그러나 이것 모두는 섬유와 아무 관련이 없습니다. 당신은 당신의 질문을 분명히해야합니다. – mghie

+0

이것이 왜이 질문과 전혀 관련이 없는지 궁금해하는 사람에게 : 편집되지 않은 질문은 태그가 달린 섬유이며 가능한 해결 방법으로 구체적으로 질문했습니다. 섬유에 대한 오해가 꽤 많은 것처럼 나는 대답을 떠날 것입니다. 참고 : VCL과 함께 사용하면 안전하지 않거나 위험하지 않습니다. – mghie

0

COM 개체는 out-of-process 모드로 실행할 수 있습니다. 델파이에서는 IPC 메커니즘을 사용하기가 조금 더 쉬울 것입니다.