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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2009, 09:07   #21
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Спасибо большое. Воспроизведу этот код у себя и разберусь. Если что буду спрашивать.

Кстати, что значит не синхронизирован, не соблюдает условия безопасности? И я вот почитал приведенный код. И так понял что 2 функции, в каждой часть задачи обрабатывается, и каждая функция на своем ядре работает. И еще если можно, распишите значение цифр и команд которые находятся th:=CreateThread(вот тут)

Последний раз редактировалось MaTBeu; 01.07.2009 в 11:59.
Iong вне форума Ответить с цитированием
Старый 01.07.2009, 10:20   #22
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

th2:=CreateThread(
Указатель на структуру безопасности, если 0 то по умолчанке,
Размер стека 0 - по родительскому процессу,
@tf2 - указатель на функцию потока,
0 - какой нить параметр,
CREATE_NEW - флаг создания,
tid - переменка куда запишется идентификатор потока);

Хелп еще не отменили, подробности в WIN32SDK.HLP
Цитата:
что значит не синхронизирован
Я не силен в синхронизации. но смысл в том что несколько потоков могут работать с одной переменной, так вот синхронизация это стратегия работы потоков, таким образом чтоб при доступе к одному и тому же блоку в памяти не мешать другому потоку...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.07.2009, 12:01   #23
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

В данном случае вам нужно либо использовать Interlocked функции, либо сделать схему синхронизации для взаимоисключающего доступа. Или сделать каждому потоку свою переменную, в которой будет результат вычисления, а потом просто сложить и все.
MaTBeu вне форума Ответить с цитированием
Старый 01.07.2009, 13:10   #24
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вообще, чувствуется, что где-то подвох..

если два потока будут считать одно и тоже, то и результат вычислений в каждом из потоков будет ОДИН И ТОТ ЖЕ! И это будет явно не быстрее, чем подсчитать это значение в ОДНОМ потоке и результат умножить на 2....
я прав?...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.07.2009, 13:14   #25
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Serge_Bliznykov
Может автору как я и думал нужно в первом потоке считать в одном диапазоне, а во втором с вругом диапазоне?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.07.2009, 18:24   #26
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Привожу код своей программы, чтобы не возникало ни каких неточностей и предположений:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  massiv:array[1..12000000] of shortint; // массив для хранения простого числа
  i,k:integer; // i-счетчик k-колличество чисел в массиве
  s,q:longint; // s-степень q-точки сохранения
  st,st1:string; // переменные для хранения заголовка файла и для сохранения числа в файл
  f,de:textfile; // переменные файлового типа
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
//обнуление массива
for i:=1 to 12000000 do
begin
massiv[i]:=0;
end;
q:=10000;
//загрузка
Assignfile(de,'chislo.doc');
{$I-}
Reset(de);
{$I+}
k:=0;
read(de,s);
While Not Eof(de) do
begin
k:=k+1;
read(de,massiv[k]);
end;
closefile(de);

//обработка числа
repeat
repeat
i:=0;
repeat
i:=i+1;
massiv[i]:=massiv[i]*2;
until k=i;
if massiv[k]>9 then k:=k+1;
i:=0;
repeat
i:=i+1;
if massiv[i]>9 then begin massiv[i]:=massiv[i]-10; massiv[i+1]:=massiv[i+1]+1; end;
until k=i;
s:=s+1;
form1.Caption:=inttostr(s);
until (s>=q)or(s=30999989);

//сохранение
if (s=q)or(s=30999989) then
begin
i:=1;
st:=inttostr(s)+'.doc';
AssignFile(f,st);
{$I-}
Append(f);
Rewrite(f);
st1:=inttostr(s)+' ';
write(f,st1);
repeat
st1:=inttostr(massiv[i])+' ';
write(f,st1);
i:=i+1;
until k=i-1;
closefile(f);
end;
q:=q+5000;
until s=30999989;
form1.caption:='Обсчет завершен!!!';
end;

end.
Вот собственно это и надо разбить на несколько потоков. думал над оптимизацией этого кода, ничего не придумал, вроде итак предельно оптимально написан. ну если есть идеи, то поделитесь.

Последний раз редактировалось Stilet; 02.07.2009 в 09:13.
Iong вне форума Ответить с цитированием
Старый 02.07.2009, 09:20   #27
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что делает этот код и зачем им нужно весь процессор загружать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.07.2009, 10:31   #28
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Этот код возводит число 2 в 30999989 степень. а на вопрос зачем загружать процессор полностью для того что бы он не работал в пустую, всё таки время на обработку этой операции меньше будет. А то тут несколько месяцев надо.

Последний раз редактировалось Iong; 03.07.2009 в 06:13.
Iong вне форума Ответить с цитированием
Старый 02.07.2009, 10:56   #29
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это линейная операция...мне не кажется что её можно разбить
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 02.07.2009, 21:58   #30
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Ну что, уважаемые программисты, ни у кого нет идей?
Iong вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Код игры на Паскале и на Делфи сильно отличается? Как переписать код с Паскаля в Делфи? Mclaren Помощь студентам 2 27.04.2009 22:37
готовое приложение ComeToDaddy Помощь студентам 17 03.04.2009 18:25
консольное приложение user_jasser Общие вопросы Delphi 3 17.10.2008 12:17
Консольное приложение a_priori Общие вопросы Delphi 6 12.03.2008 08:33
Пароль на приложение Chals Общие вопросы Delphi 6 24.11.2007 21:32