Многопоточное программирование в DELPHI (1)
Мы знаем, что и Win95, и WinNT являются «многопоточными» операционными системами. В DELPHI 2.0 мы можем в полной мере использовать эту возможность и писать «многопоточные» приложения.
Для тех, кто раньше писал программы под DOS или 16-битные Windows, «многопоточность» все еще незнакома, но так же, как мы перешли от однозадачности под DOS к многозадачности под Windows 3.1, теперь мы должны сделать переход снова. В области «многопоточности» ведь компьютерный век постоянно развивается. Однако, к счастью, многопоточное программирование в DELPHI2.0 не требует от нас изучения огромных функций WIN32API. Для завершения нашей работы мы можем использовать стандартный многопоточный класс TThread в DELPHI.
TThread — это абстрактный класс, то есть нет необходимости объявлять переменные на основе TThread (а переменные, объявленные на основе TThread, совершенно бесполезны). Нам нужно использовать TThread в качестве базового класса и сгенерировать его. форма наследования. На самом деле, писать многопоточные приложения на основе TThread очень легко.
Ниже приведен базовый многопоточный класс, созданный путем наследования TThread.
QuerThrd. Па
unitQuerThrd;
интерфейс
использует
Классы,DBTables;
тип
Класс TQueryThread(TThread)
Частный
fQuery: tQuery;
защищенный
процедураВыполнить;переопределить;
общественный
конструкторCreate (Приостановлено: Boolean; Запрос: TQuery);
конец;
выполнение
конструктор
TQueryThread. Create(Приостановлено: Boolean; Запрос: TQuery);
начинать
унаследованноеСоздать (Приостановлено);
fQuery: ΚQuery;
FreeOnTerminate: ΚTrue;
конец;
процедураTQueryThread. Выполнять;
начинать
fQuery. Открыть;
конец;
конец.
В приведенном выше простом примере мы создали подкласс TQuery-Thread от TThread для выполнения запросов к базе данных в фоновом режиме. В функции Create этого класса передаются два параметра Suspended и Query, где Suspended используется для управления работой потока. Если Suspend имеет значение true, поток класса TQueryThread будет приостановлен сразу после его установления до момента возобновления. метод будет запущен. Поток продолжит выполнение. Параметр Query используется для принятия существующего элемента управления Query (настоящего элемента управления Query в форме), чтобы он выполнялся в многопоточной ситуации. Выполнение — самый важный процесс. Это часть выполнения класса TQueryThread. Все операторы, которые необходимо выполнить в этом многопоточном классе, должны быть написаны в этом процессе.
Фактически, при создании собственного многопоточного класса вам не нужно вводить все эти коды. Выберите новую опцию в меню «Файл» DELPHI, затем выберите проект «TThreadObject», и DELPHI создаст для вас базовый программный модуль. Затем мы можем внести соответствующие изменения по мере необходимости.
Выполнение процесса:
Предположим, мы создали форму FORM1, содержащую элемент управления запросом Query1, который мы собираемся использовать. Затем добавляем написанный выше модуль QuerThrd в часть USES модуля.
процедураTForm1. Button1Click (Отправитель: TObject);
начинать
{Создать запущенный процесс}
TQueryThread. Создать (Ложь, Запрос1);
конец;
Если этот процесс будет выполнен, элемент управления запросом Query1 в форме автоматически выполнит запрос в многопоточной среде. Обратите внимание, что в классе TQueryThread есть только Create, но не Free. После динамического создания класса, а затем забывания его удалить, это одна из ошибок, которые мы часто допускаем. Однако, поскольку мы указали FreeOnTerminate (удалить после запуска) как true. здесь, когда оператор в Execute выполняется. После завершения управление памятью, занятое классом TQueryThread, будет автоматически освобождено.
Однако есть еще одна проблема, заслуживающая нашего внимания. Поскольку одновременно могут выполняться несколько потоков, нам также необходимо решить проблему синхронизации. Если между несколькими многопоточными программами нет корреляции, то и корреляции между ними не будет. любой конфликт. Но на самом деле одновременно могут работать несколько многопоточных приложений баз данных. Поскольку одни и те же ресурсы базы данных должны быть общими, нам также необходимо добавить элемент управления Tsession в Query1.
Фактически, хотя мы, возможно, лично не использовали элемент управления сеансом, DELPHI автоматически создает временный элемент управления сеансом во время всех обращений к базе данных и динамически удаляет его после использования. При обычном программировании базы данных нам не нужно делать это самостоятельно, но в случае многопоточного выполнения базы данных, чтобы не конфликтовать между собой, мы должны настроить свой собственный элемент управления сеансом для каждого доступа к базе данных. Этот шаг очень прост. Нам нужно всего лишь добавить в форму элемент управления Session, затем записать произвольное имя в его свойство «Sessionname», а затем написать то же имя в «Sessionname» Query1. Таким образом, наша программа базы данных безопасна.
Другой тип проблемы синхронизации, которую необходимо решить, — это те программы, которые работают с ресурсами VCL. Таких программ много, но, к счастью, решение тоже очень простое.
Мы можем посмотреть на такую программу:
единицаBncThrd;
интерфейс
использует
WinProcs, классы, графика, ExtCtrls;
тип
Класс TBounceThread(TThread)
частный
Фшапе: Тшапе;
FXSpeed: целое число;
FYSpeed: целое число;
процедураMoveShape;
защищенный
процедураВыполнить;переопределить;
общественный
КонструкторCreate (Приостановлено: логическое значение; Форма: TShape; XSpeed, YSpeed: Integer);
PropertyShape: TShaperreadFShape;
конец;
выполнение
процедураTBouad. МовеШейп;
вар
MaxHeight, MaxWidth: целое число;
начинать
сFShapedo
начинать
Слева: ΚLeft+FXSpeed;
Вверху: ΚTop+FYSpeed;
если (слеваΙ0) или
(Влево+ШиринаΛРодитель.Ширина), затем
FXSpeed: ΚFXSpeed*-1;
если (TopΙ0) или
(Вверх+ВысотаΛParent.Высота), затем
FYSpeed: ΚFYSpeed*-1;
Блог автора: http://blog.csdn.net/zou5655/