Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2010, 21:02   #1
tanek
Форумчанин
 
Регистрация: 07.03.2009
Сообщений: 209
Печаль засада с программой

Здраствуйте дорогие форумчанины. Возникла проблема с потоками... Написала программа которая выводит с помошью потоков разноцветные точки в продолжающуюся вертикальную праямую.... Но вот вчем проблема программа либо не выводит вообще ничего либо выводит какими то кусочками... Вы не поможите мне исправить программу?
Я буду вам очень признательна)))))
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    BitBtn1: TBitBtn;
    RadioGroup1: TRadioGroup;
    RadioGroup2: TRadioGroup;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ThreadId1,ThreadId2:DWORD;    //  индетификатор создаваемого потока
  HThread1,HThread2:THandle;  //  указатель на создаваемый поток
  colors:tcolor;//цвета точек
  i,j:integer;
//threadvar
   x,y,dx,dy:integer;
implementation

{$R *.dfm}

procedure DrawingPixels1;//процедура рисования точки
begin
  colors:=rgb(random(255), random(255), random(255));//рандомный выбор цвета
  Form1.Canvas.Pen.Color:=colors;//закрашиваем линию точки
  Form1.Canvas.brush.Color:=colors;//закрашиваем фон точки
  Form1.Canvas.Ellipse(x,y,x+5,y+5);//рисуем точку
  ExitThread(0);//завершаем поток
end;

procedure DrawingPixels2;//процедура рисования точки
begin
  colors:=rgb(random(255), random(255), random(255));//рандомный выбор цвета
  Form1.Canvas.Pen.Color:=colors;//закрашиваем линиюб точки
  Form1.Canvas.brush.Color:=colors;//закрашиваем фон точки
  Form1.Canvas.Ellipse(x,y,x+5,y+5);//рисуем точку
  ExitThread(0);//завершаем поток
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  i:=0;
  j:=0;
  case RadioGroup1.ItemIndex of
    1: SetThreadPriority(HThread1,Thread_Priority_Idle);
    2: SetThreadPriority(HThread1,Thread_Priority_Lowest);
    3: SetThreadPriority(HThread1,Thread_Priority_Below_Normal);
    4: SetThreadPriority(HThread1,Thread_Priority_Normal);
    5: SetThreadPriority(HThread1,Thread_Priority_Above_Normal);
    6: SetThreadPriority(HThread1,Thread_Priority_Highest);
    7: SetThreadPriority(HThread1,Thread_Priority_Time_Critical);
  end;
   case RadioGroup2.ItemIndex of
    1: SetThreadPriority(HThread1,Thread_Priority_Idle);
    2: SetThreadPriority(HThread1,Thread_Priority_Lowest);
    3: SetThreadPriority(HThread1,Thread_Priority_Below_Normal);
    4: SetThreadPriority(HThread1,Thread_Priority_Normal);
    5: SetThreadPriority(HThread1,Thread_Priority_Above_Normal);
    6: SetThreadPriority(HThread1,Thread_Priority_Highest);
    7: SetThreadPriority(HThread1,Thread_Priority_Time_Critical);
  end;
  repeat
    repeat
      HThread1:=CreateThread (nil, 0, @DrawingPixels1, nil, 0, ThreadId1);//создаем 1-ый поток
      y:=y+dy;
      HThread2:=CreateThread (nil, 0, @DrawingPixels2, nil, 0, ThreadId2);//создаем 2-ой поток
      y:=y+dy;
      inc(i)
    until i=3;
    i:=0;
    y:=0;
    x:=x+5;
    inc(j);
  until j=2;
end;

procedure TForm1.FormCreate(Sender: TObject);//процедура установки начальных данных
begin
  x:=200;//координаты точки по x
  y:=0;//координаты точки по y
  dy:=5;//смещение точки по y
end;

end.
Вложения
Тип файла: rar Archive.rar (220.1 Кб, 7 просмотров)
tanek вне форума Ответить с цитированием
Старый 18.03.2010, 22:06   #2
tanek
Форумчанин
 
Регистрация: 07.03.2009
Сообщений: 209
По умолчанию

ошибку я на шла)))) оказалось что в потоки не передаются парамтеры x и y. Но вот почему не как не могу понять. Я использовала
Код:
threadvar
так там вообще беда.... Может можно как нибудь подругому передать параметры???
tanek вне форума Ответить с цитированием
Старый 19.03.2010, 14:10   #3
tanek
Форумчанин
 
Регистрация: 07.03.2009
Сообщений: 209
По умолчанию

мальчики и девочки подскажите мне как исправить.... уж сил моих больше нет((((((
tanek вне форума Ответить с цитированием
Старый 19.03.2010, 15:13   #4
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Код:
HANDLE proc;
DWORD ResultProc, idThread;
// создаем поток и не запускаем его
proc = CreateThread(NULL, 0, searchBinary, &searchingNumber, CREATE_SUSPENDED, &idThread); 
ResumeThread(proc); // запускаем поток
WaitForSingleObject(proc, INFINITE); // ожидаем завершения выполнения расчетов в потоке
GetExitCodeThread(proc, &ResultProc); // получаем результат работы потока в переменную ResultProc
CloseHandle(proc); // закрываем поток

DWORD WINAPI searchBinary(LPVOID g_KeySearch) // функция потока
{ 
	int* psearch = (int *)g_KeySearch;
	int L = 0;
	int U = sizeOfaFile - 1;
	int pos, res;
	res = pos = ELEMENT;
	while (L <= U)
	{
		pos = L + (U - L) / 2;
		if (*psearch < arrayOfNumbers[pos])
		{
			L = pos + 1;
		}
		else if (*psearch > arrayOfNumbers[pos])
		{
			U = pos - 1;
		}
		else
		{
			res = pos;
			break;
		}

	}
	return (DWORD)res;
}
это С++, но все равно посмотри
searchingNumber - параметр, передаваемый в поток (поток может принять только 1 параметр целочисленного типа)
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]

Последний раз редактировалось RUSt88; 19.03.2010 в 15:16.
RUSt88 вне форума Ответить с цитированием
Старый 19.03.2010, 15:20   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от tanek Посмотреть сообщение
ошибку я на шла)))) оказалось что в потоки не передаются парамтеры x и y. Но вот почему не как не могу понять.
Немного не так. Вы создаете потоки для рисования каждой точки. К тому времени, когда потокам понадобятся координаты, цикл скорее всего уже будет завершен и координата y будет содержать максимальное значение.

Попробуйте вот это:

Код:
uses SyncObjs;

var CS:TCriticalSection;

procedure DrawLine(x:integer);
var y : integer;
    c:TColor;
begin
   y := 0;
   while y < 400 do begin
      CS.Enter;
      Form1.Canvas.Lock;
      try
         c := rgb(random(255), random(255), random(255));
         Form1.Canvas.Pen.Color   := C;
         Form1.Canvas.brush.Color := C;
         Form1.Canvas.Ellipse(x, y, x+5, y+5);
      finally
         Form1.Canvas.Unlock;
         CS.Leave;
      end;
      inc(y, 5);
      sleep(30);
   end;
end;

procedure DrawLine1;
begin
   DrawLine(100);
end;

procedure DrawLine2;
begin
   DrawLine(200);
end;

procedure TForm1.Button1Click(Sender: TObject);
var ThreadId1, ThreadId2:DWORD;
begin
   CS := TCriticalSection.Create;
   CreateThread(nil, 0, @DrawLine1, nil, 0, ThreadId1);
   CreateThread(nil, 0, @DrawLine2, nil, 0, ThreadId2);
end;
Надеюсь, это поможет разобраться.
alexBlack вне форума Ответить с цитированием
Старый 19.03.2010, 15:59   #6
tanek
Форумчанин
 
Регистрация: 07.03.2009
Сообщений: 209
По умолчанию

спасибо alexBlack я сделала по другому и онга работает))))
но вот теперь такой вопрос возник. Как я понимаю я сделала поток в потоке. А хочется сделать два разных потоков, для того чтобы ставить разные приоритеты. Из статей я поняла что, чтобы создать поток, нужно объявить новый класс.... А можно без этого как то обойтись?))))
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 type
TCountObj = class(TThread)
  private
  { Private declarations }
    x,y,dx,dy:integer;
  protected
    procedure Execute; override;
    procedure DrawingPixels1;
    procedure DrawingPixels2;
end;
var
  Form1: TForm1;
  co:TCountObj;
implementation

{$R *.dfm}
procedure TCountObj.Execute;
var
  i,j:integer;
begin
{ Place thread code here }
  j:=0;
  x:=0;
  y:=0;
  dx:=5;
  dy:=5;
  repeat
     i:=0;
     repeat
      Synchronize(DrawingPixels1);
      //Если поток остановлен, то выйти.
      if terminated then exit;
      y:=y+dy;
      Synchronize(DrawingPixels1);
      //Если поток остановлен, то выйти.
      if terminated then exit;
      y:=y+dy;
      inc(i)
    until i=50;
    x:=x+dx;
    y:=0;
    inc(j);
  until j=300;
end;
procedure TCountObj.DrawingPixels1;
var
  colors:Tcolor;
begin
  colors:=rgb(random(255), random(255), random(255));//рандомный выбор цвета
  Form1.Canvas.Pen.Color:=colors;//закрашиваем линию точки
  Form1.Canvas.brush.Color:=colors;//закрашиваем фон точки
  Form1.Canvas.Ellipse(x,y,x+5,y+5);//рисуем точку

end;
procedure TCountObj.DrawingPixels2;
var
  colors:Tcolor;
begin
  colors:=rgb(random(255), random(255), random(255));//рандомный выбор цвета
  Form1.Canvas.Pen.Color:=colors;//закрашиваем линию точки
  Form1.Canvas.brush.Color:=colors;//закрашиваем фон точки
  Form1.Canvas.Ellipse(x,y,x+5,y+5);//рисуем точку

end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  co:=TCountObj.Create(true);
  co.Resume;
  co.Priority:=tpLower;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  co.Terminate;
end;

end.
tanek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с программой KillJoy Помощь студентам 1 11.11.2009 19:30
помогите с программой Shuric Помощь студентам 6 23.06.2009 00:33
Помогите с программой!! Photomachine Помощь студентам 1 08.02.2009 15:26
помогите с программой 1234 Общие вопросы Delphi 2 21.04.2008 10:50