Ir ao conteúdo

Problema com Thread - conflito ao usar duas, simultaneamente.


Matheus Lacombe

Posts recomendados

Postado

Seguinte pessoal:

Montei um programa só para aprender a mexer com duas Threads ao mesmo tempo. Ele é como mostra a imagem abaixo, com apenas 4 Buttons e 2 Labels que são incrementados cada vez que uma Thread termina um loop:

threadk.png

PROBLEMA: Só consigo ligar uma Thread de cada vez. Não consigo usar duas ao mesmo tempo sem o programa travar até o fim do loop.

Programa:

Dois botões para criar as duas Threads e dois botões para para-las. Dentro de cada Thread há um loop para incrementar uma variavel e atulizar o label da form com o número do loop até 100000;

BOTÃO PARA CRIAR A THREAD -Button1

procedure TForm1.Button1Click(Sender: TObject);
begin
//-- Cria núcleo 1
UCP1:= Nucleo1.Create(true);
UCP1.FreeOnTerminate := True;
UCP1.Priority := tpHighest;
UCP1.Resume;
end;

BOTÃO PARA PARAR A THREAD - Button3

procedure TForm1.Button3Click(Sender: TObject);
begin
//-- Para núcleo 1
UCP1.Resume;
UCP1.Suspend;
UCP1.Terminate;
end;

UNIT DOS BOTÕES

unit Principal;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
i: Integer;
end;

var
Form1: TForm1;
UCP1: TThread;
UCP2: TThread;

implementation

uses CPU1, CPU2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
//-- Cria núcleo 1
UCP1:= Nucleo1.Create(true);
UCP1.FreeOnTerminate := True;
UCP1.Priority := tpHighest;
UCP1.Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//-- Cria núcleo 2
UCP2:= Nucleo2.Create(true);
UCP2.FreeOnTerminate := True;
UCP2.Priority := tpNormal;
UCP2.Resume;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
//-- Para núcleo 1
UCP1.Resume;
UCP1.Suspend;
UCP1.Terminate;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
//-- Para núcleo 2
UCP2.Resume;
UCP2.Suspend;
UCP2.Terminate;
end;

end.

UNIT DA THREAD-1

unit CPU1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
Nucleo1 = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure Tarefa;
end;

implementation

uses Principal;

procedure Nucleo1.Execute;
begin
repeat
Synchronize(Tarefa);
until Form1.i=1000000;
end;

procedure Nucleo1.Tarefa;
begin
Form1.i:=Form1.i+1;;
Form1.Label1.Caption:=IntToStr(Form1.i);
Form1.Label1.Update;
end;

end.

UNIT DA THREAD-2

unit CPU2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
Nucleo2 = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure Tarefa;
end;

implementation

uses Principal;

procedure Nucleo2.Execute;
begin
repeat
Synchronize(Tarefa);
until Form1.i=1000000;
end;

procedure Nucleo2.Tarefa;
begin
Form1.i:=Form1.i+1;;
Form1.Label2.Caption:=IntToStr(Form1.i);
Form1.Label2.Update;
end;

end.

UNIT PROJETO

program MultiThreadPRJT;

uses
Forms,
Principal in 'Principal.pas' {Form1},
CPU1 in 'CPU1.pas',
CPU2 in 'CPU2.pas',
CPU3 in 'CPU3.pas';

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

PROBLEMA: Só consigo ligar uma Thread de cada vez. Não consigo usar duas ao mesmo tempo sem o programa travar até o fim do loop.

.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!