데이터 수집 기술은 산업 제어, 자동화 및 기타 분야에서 중요한 역할을 합니다. 일반적인 데이터 수집 과정은 다음과 같습니다.
① 캡쳐카드에 채널 선택 명령을 보냅니다. ②수집할 채널번호를 선택합니다. ③A/D 변환을 시작합니다. ④변환이 완료될 때까지 기다립니다. ⑤획득 카드에서 데이터를 읽습니다. 다중 채널 획득의 경우 일반적으로 프로그램 설계에 두 가지 방법이 사용됩니다. 쿼리 방법 또는 인터럽트 방법. 소위 쿼리 방법은 루프를 사용하여 각 데이터 채널을 순차적으로 수집하는 것입니다. 질의 방식의 장점은 프로그램이 간단하고 구현이 쉽다는 점이며, 단점은 수집 과정에서 CPU가 대부분의 시간을 기다리며 소비하므로 리소스가 낭비된다는 점입니다. 인터럽트 방법은 하드웨어 인터럽트 형식을 채택합니다. 먼저 A/D 변환을 시작하고 변환이 끝나면 인터럽트 신호를 보냅니다. CPU는 수집 카드의 인터럽트에 응답할 때 수집된 데이터를 읽습니다. 이런 식으로 변환을 기다리는 동안 CPU는 대기 상태에 빠지지 않고 다른 계산을 수행할 수 있습니다. 인터럽트 방법의 장점은 리소스를 최대한 활용할 수 있다는 것입니다. 그러나 프로그램 설계가 복잡합니다. 특히 시스템의 하드웨어 인터럽트 리소스가 부족한 경우 Windows나 Windows와 같은 운영 체제에서 인터럽트 충돌이 발생하기 쉽습니다. Win95에서는 사용자가 인터럽트 핸들러를 설치할 수 없으며 이를 달성할 수 없습니다.
---- 위에서 논의된 두 가지 방법은 모두 DOS에서의 방법입니다. 이제 더 나은 방법인 멀티스레딩 기술이 있습니다. 이제 데이터 수집을 위해 멀티스레딩 기술을 활용할 수 있습니다.
---- 1. 데이터 수집을 위한 멀티스레딩 사용의 장점
---- Win95/98의 가장 인기 있는 점은 아름다운 인터페이스 외에도 멀티스레딩과 멀티태스킹입니다. DOS 환경에서는 실행 프로그램이 모든 리소스를 독점할 수 있습니다. Windows 환경에서는 약간 초보적인 멀티 태스킹 환경이지만 원하는 만큼 프로그램이 여전히 모든 CPU 시간을 제어할 수 있습니다. 그러나 Windows95와 Windows NT에서는 프로그램이 모든 CPU 실행 시간을 독점할 수 없습니다. 게다가 프로그램은 처음부터 끝까지 한 줄이 아닙니다. 반대로, 프로그램은 실행 중에 여러 프로그램 조각으로 나누어 동시에 실행될 수 있습니다. 동시에 실행될 수 있는 이러한 프로그램 조각을 스레드라고 합니다. Windows 95와 Windows NT에서는 운영 체제가 동시에 여러 프로그램을 차례로 실행할 수 있는데, 이는 멀티태스킹입니다.
---- 데이터 수집을 위해 멀티스레딩을 사용하면 프로그램의 응답 속도를 효과적으로 높이고 실행 효율성을 높일 수 있습니다. 일반 프로그램은 사용자 입력을 처리해야 하는데, CPU의 실행 속도에 비하면 사용자 입력 속도는 걷거나 날아가는 것과 같습니다. 이러한 방식으로 CPU는 사용자 입력을 기다리는 데 많은 시간을 낭비하게 됩니다(예: DOS 환경에서). 멀티스레딩을 사용하는 경우 한 스레드는 사용자 입력을 기다리는 데 사용될 수 있으며, 다른 스레드는 데이터 처리 또는 기타 작업을 수행할 수 있습니다. 데이터 수집 프로그램의 경우 데이터 수집을 위해 별도의 스레드를 사용할 수 있습니다. 이러한 방식으로 수집의 실시간 특성을 최대한 보장할 수 있으며, 동시에 다른 스레드는 사용자 작업에 응답하거나 적시에 데이터 처리를 수행할 수 있습니다. 그렇지 않으면 프로그램은 데이터를 수집할 때 사용자 작업에 응답할 수 없습니다. 특히 수집되는 데이터의 양이 많고 데이터 처리 작업이 많은 경우 멀티스레딩을 사용하지 않으면 수집 중 오랜 대기 시간은 매우 허용됩니다.
---- 그러나 멀티스레딩은 일반 프로그래밍보다 훨씬 더 복잡합니다. 여러 스레드가 언제든지 동시에 실행될 수 있으므로 다른 스레드에 의해 많은 변수와 데이터가 수정될 수 있습니다. 이는 멀티스레드 프로그램에서 스레드 간의 가장 중요한 동기화 제어 문제입니다.
---- 2. 데이터 수집을 위해 멀티스레딩으로 해결해야 할 문제
---- 사실 멀티스레드 프로그래밍의 복잡성은 일시적입니다. 멀티스레드 설계에 기존 C를 사용하는 경우 스레드 간의 동기화를 직접 제어해야 합니다. 그것은 복잡할 것입니다. 그러나 객체 지향 설계 방법을 사용하고 멀티 스레드 프로그래밍에 Delphi를 사용하면 문제가 훨씬 간단해집니다. 이는 Delphi가 멀티스레딩의 복잡성을 처리해 주었고 우리가 해야 할 일은 상속뿐이기 때문입니다.
---- 구체적으로 멀티스레드 데이터 수집은 다음 작업을 완료해야 합니다.
---- ① TThread 클래스에서 자신만의 SampleThread 클래스를 파생시킵니다. 이것은 데이터 수집에 사용하는 클래스입니다. 수집할 때 SampleThread의 인스턴스를 생성하기만 하면 됩니다.
---- ② 슈퍼클래스 TThread의 Execute 메소드를 오버로드합니다. 이 방법에서는 데이터 수집 작업이 구체적으로 수행됩니다.
---- ③ 수집과 표시를 동시에 하고 싶다면 호출할 Execute 메소드에 대한 수집 진행 상황을 표시하는 프로세스를 여러 개 작성합니다.
----TThread 클래스에서 가장 일반적으로 사용되는 속성/메서드는 다음과 같습니다.
생성 방법: 생성자 생성
(CreateSuspended: 부울);
----CreateSuspended 매개 변수는 스레드가 생성될 때 즉시 실행할지 여부를 결정합니다. True이면 새 스레드가 생성 후 일시 중지되고, False이면 스레드가 생성 후 즉시 실행됩니다.
FreeOnTerminate 속성:
PRerty FreeOnTerminate: 부울;
---- 이 속성은 프로그래머가 스레드 취소를 담당하는지 여부를 결정합니다. 이 속성이 True이면 VCL은 스레드가 종료될 때 스레드 객체를 자동으로 삭제합니다. 기본값은 False입니다.
OnTerminate 속성:
속성 OnTerminate: TNotifyEvent;
---- 이 속성은 스레드가 종료될 때 발생하는 이벤트를 지정합니다.
---- 구체적인 예를 살펴보겠습니다.
---- 3. 멀티스레드 데이터 수집 구현
---- 펌핑장치의 성능도를 측정하기 위해 저자가 개발한 프로그램이다. 그 기능은 펌핑 장치의 서스펜션 지점의 하중 및 변위 데이터를 수집한 다음 처리 후 펌핑 장치의 작업 다이어그램을 만드는 것입니다. 그림 1(생략)은 데이터 수집 중 인터페이스를 보여줍니다. "데이터 수집" 버튼을 클릭하면 프로그램이 새 스레드를 생성하고 해당 속성을 설정합니다. 이 새 스레드는 데이터 수집 작업을 완료합니다. 절차는 다음과 같습니다.
ProcedureTsampleForm.
DoSampleBtnClick(발신자: TObject);
시작하다
ReDrawBtn.Enabled := 참;
DoSampleBtn.Enabled := 거짓;
FFTBtn.Enabled := 참;
TheSampler := SampleThread.Create(False);
컬렉션 스레드 생성
TheSampler.OnTerminate := FFTBtnClick;
수집이 완료된 후 수행할 작업
TheSampler.FreeOnTerminate := 참;
수집 완료 후 실행 취소
끝;
----수집 스레드의 클래스 정의는 다음과 같습니다.
유형
샘플스레드 = 클래스(TThread)
공공의
함수 AdRead(ach: 바이트): 정수;
A/D 카드를 읽는 기능
프로시저 UpdateCaption;
수집 시간 표시
사적인
{비공개 선언}
보호됨
thes, thep: 진짜;
dt: 진짜;
아이디: 정수;
st, ed: LongInt;
프로시저 실행;
이것이 핵심입니다.
끝;
---- 본 클래스에서는 A/D 카드를 동작시키기 위한 AdRead 함수를 정의하고, 두 프로세스를 이용하여 수집 진행 상황과 시간을 표시한다. AdRead 함수는 어셈블리로 작성되었으며 매개변수 호출 형식은 safecall이어야 합니다.
----키 오버로드된 메서드 Execute의 코드는 다음과 같습니다.
프로시저 SampleThread.Execute;
시작하다
StartTicker := GetTickCount;
아이디 := 0;
반복하다
thes := Adread(15) * ad2mv * mv2l;
채널 15 획득
thep := Adread(3) * ad2mv * mv2n;
채널 3 획득
dt := GetTickCount - StartTicker;
sarray[id] := thes;
parray[id] := thep;
tarray[id] := dt;
Inc(ID);
동기화(UpdateCaption);
참고: 수집 진행 상황을 표시합니다.
ID >=4096까지;
ed := GetTickCount;
동기화(ShowCostTime);
참고: 소요된 시간을 표시하세요.
끝;
---- 위의 코드에서 볼 수 있듯이 Execute는 일반 코드와 본질적으로 다르지 않습니다. 유일한 차이점은 수집 진행 상황을 표시하고 시간을 표시할 때 해당 프로시저를 직접 호출할 수 없고 동기화를 호출하여 간접적으로 호출할 수 있다는 점입니다. 이는 프로세스 간의 동기화를 유지하기 위해 수행됩니다.
---- 4. 결론
----위 프로그램은 Delphi 4.0을 사용하여 프로그래밍되었으며 AMD-K6-2/300에서 구현되었습니다. 테스트 결과는 다음과 같습니다. 멀티스레딩을 사용하면 4096포인트를 수집하는 데 일반적으로 10~14초가 걸리고, 멀티스레딩을 사용하지 않으면 1분~1분 30초 정도 걸립니다. 멀티스레딩을 사용하면 프로그램의 실행 효율성이 크게 향상될 수 있음을 알 수 있습니다.