문제

저는 자체 스레드에서 TDataSet를 비동기식으로 열어 메인 VCL 스레드가 작업이 완료될 때까지 계속할 수 있도록 하고, 그런 다음 나중에 해당 TDataSet에서 메인 VCL 스레드를 읽도록 하고 싶습니다.나는 몇 가지 실험을 했고 매우 이상한 상황에 처해 있었습니다. 그래서 누군가가 이전에 이런 일을 해 본 적이 있는지 궁금합니다.

TDataSet이 별도의 스레드에서 생성되어 열리고 데이터가 읽혀지는 일부 샘플 앱을 본 적이 있지만 이 모든 작업은 별도의 스레드에서 수행됩니다.다른 스레드가 데이터 소스를 연 후 메인 VCL 스레드의 TDataSet에서 읽는 것이 안전한지 궁금합니다.

저는 Delphi 7에서 TmySQLQuery를 사용하여 Win32 프로그래밍을 하고 있습니다. MySQL용 DAC 내 TDataSet 자손으로.

도움이 되었습니까?

해결책

자체 스레드에서만 데이터 세트를 사용하려는 경우 다른 구성 요소와 마찬가지로 동기화를 사용하여 VCL/UI 업데이트에 대한 기본 스레드와 통신할 수 있습니다.
또는 자체 메시징 시스템을 사용하여 메인 스레드와 작업자 스레드 간의 통신을 구현할 수 있는 것이 더 좋습니다.

여기에서 Hallvard의 스레딩 솔루션을 확인하세요.
http://hallvards.blogspot.com/2008/03/tdm6-knitting-your-own-threads.html

아니면 다른 것:
http://dn.codegear.com/article/22411

동기화 및 비효율성에 대한 설명:
http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/Ch3.html

다른 팁

나는 TDataSet의 다른 구현을 통해 이 작업이 수행되는 것을 보았습니다. 아스타 구성 요소.이들은 서버에 접속하고 즉시 반환된 다음 데이터가 로드되면 이벤트를 발생시킵니다.

그러나 나는 그것이 구성 요소에 따라 크게 좌우된다고 생각합니다.예를 들어, 동일한 Asta 구성 요소는 기본 VCL 스레드 이외의 다른 곳에서는 동기식으로 열 수 없습니다.

간단히 말해서, 저는 이것이 TDataSet 자체의 제한이라기보다는 구현에 따른 제한이라고 생각하며, 언급한 구성 요소에 액세스할 수 없습니다.

같은 것을 사용할 때 주의할 점 TDataSet 여러 스레드 사이에서는 주어진 시간에 현재 레코드만 읽을 수 있습니다.따라서 한 스레드에서 레코드를 읽고 다른 스레드가 호출하는 경우 다음 그렇다면 당신은 곤경에 처한 것입니다.

또한 스레드에는 자체 데이터베이스 연결이 필요할 가능성이 높다는 점을 기억하십시오.나는 여기에 필요한 것은 스레드의 데이터를 (쓰기 전용) 메인 VCL 스레드에서만 읽는 멀티 스레드 "보유" 개체라고 생각합니다.읽기 전에 일종의 동기화 방법을 사용하여 같은 순간에 글을 읽지 않거나 같은 순간에 읽은 내용을 쓰지 않도록 하거나 모든 것을 메모리 파일에 로드하고 동기화 방법을 작성하여 파일의 위치를 ​​기본 앱에 알려줍니다. 읽기를 중지하세요.

나는 예상되는 레코드 수(및 데이터 세트의 크기)에 따라 마지막 접근 방식을 몇 번 취했으며 이를 로컬 시스템의 물리적 디스크 파일에 적용하기도 했습니다.꽤 잘 작동합니다.

다중 스레드 데이터 액세스를 수행했지만 간단하지 않습니다.

1) 스레드별로 세션을 생성해야 합니다.

2) 해당 TDataSet 인스턴스에 수행되는 모든 작업은 해당 인스턴스가 생성된 스레드의 컨텍스트에서 수행되어야 합니다.예를 들어 배치하고 싶다면 쉽지 않습니다.그 위에 DB 그리드가 있습니다.

3) 예를 들어 허용하려는 경우메인 스레드가 데이터를 가지고 놀 때, 간단한 해결책은 데이터를 일종의 별도의 컨테이너로 옮기는 것입니다.메모리 데이터세트.

4) 데이터 검색이 완료되면 메인 스레드에 알리기 위한 일종의 신호 메커니즘이 필요합니다.

...그리고 예외 처리도 간단하지 않습니다...

하지만:일단 성공하면 애플리케이션은 정말 우아해질 것입니다!

대부분의 TDataset는 스레드로부터 안전하지 않습니다.내가 아는 것 중 하나는 스레드로부터 안전하다는 것입니다. kbmMemtable.또한 레코드 포인터 이동 문제(Jim McKeeth의 설명)가 발생하도록 데이터 세트를 복제하는 기능도 있습니다.이는 얻을 수 있는(구매 또는 무료) 최고의 데이터 세트 중 하나입니다.

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