С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 5
1

Отслеживание создания/изменения файлов на накопителях (cd/usb)

27.07.2017, 16:00. Показов 2032. Ответов 10

Author24 — интернет-сервис помощи студентам
День добрый, имеется одна проблемка с потоками. Необходимо создать софт, позволяющий отслеживать создание/изменение файлов на накопителях(cd/usb). На просторах интернета я нашел пару примеров для создания такой программки, но необходимо дополнить, основной функционал я реализовал, но никак не могу сообразить в чём загвоздка. Один немаловажный нюанс, одновременно в пк может быть воткнуто две или более флешки, соотвественно необходимо следить за каждым накопителем в отдельном потоке. Вот в этом у меня и проблема. Подскажите пожалуйста как решить её.
ps за ужасный код не пинайте, я оочень редко пишу на делфи
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, UDirMon;
 
const
  WMNotify = WM_USER; //Номер сообщений, которые отправляет монитор.
 
type
  TForm1 = class(TForm)
    BtnDmStart: TButton;
    BtnDmStop: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Memo3: TMemo;
    Memo4: TMemo;
    Button2: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Memo5: TMemo;
    Button1: TButton;
    procedure BtnDmStartClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure SaveMon;
    procedure SaveLog;
    procedure Start(Drive:string);
    procedure Stop(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
    procedure BtnDmStopClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
 
 
  private
    { Private declarations }
  protected
    procedure ProcDmNotify(var Message: TWMNoParams); message WMNotify;
    procedure DmTerminate(Sender: TObject);
 
  public
    { Public declarations }
    FPath : String;
    FDmThr : TDmThr;
    FHMtxBuff : THandle;
  end;
    const
     DBT_DeviceArrival = $8000;
   DBT_DeviceRemoveComplete = $8004;
   DBTF_Remove = $0000;
   DBTF_Media = $0001;
   DBT_DevTyp_Volume = $0002;
 
 type
   PDevBroadcastHdr = ^TDevBroadcastHdr;
   TDevBroadcastHdr = packed record
     dbcd_size: DWORD;
     dbcd_devicetype: DWORD;
     dbcd_reserved: DWORD;
   end;
 
 type
   PDevBroadcastVolume = ^TDevBroadcastVolume;
   TDevBroadcastVolume = packed record
     dbcv_size: DWORD;
     dbcv_devicetype: DWORD;
     dbcv_reserved: DWORD;
     dbcv_unitmask: DWORD;
     dbcv_flags: Word;
   end;
   tnew = class(tthread)
  private
  s: string;
  procedure addstr;
  protected
  procedure execute; override;
  end;
 
 
 
 
var
  Form1: TForm1;
  fl, fl_mon : TextFile;
  drive:string;
  aTh : array ['A'..'Z'] of tnew;
...
procedure TForm1.ProcDmNotify(var Message: TWMNoParams);
var
  i : Integer;
  ResWait : Integer;
  PFni, PFniPrev : TPFni;
  S : String;
  Ws : WideString;
begin
 
  i := 0;
  repeat
    Inc(i);
    Application.ProcessMessages;
    ResWait := WaitForSingleObject(FHMtxBuff, 100);
  until (i = 10) or (ResWait = WAIT_OBJECT_0);
  if ResWait <> WAIT_OBJECT_0 then begin
    Memo2.Lines.Add('Монитор не отвечает!');
    Memo4.Lines.Add('Монитор не отвечает!');
    SaveMon;
    Exit;
  end;
  try
    if FDmThr.FBuffSize > 0 then begin
      PFni := @FDmThr.FBuff[0];
      repeat
        S := '----------'#13#10'Действие: ';
        case PFni^.Action of
          FILE_ACTION_ADDED    : S := S + 'Создание файла.';
          FILE_ACTION_REMOVED  : S := S + 'Удаление файла.';
          FILE_ACTION_MODIFIED : S := S + 'Изменение атрибутов файла.';
          FILE_ACTION_RENAMED_OLD_NAME : S := S + 'Переименование файла. Прежнее имя.';
          FILE_ACTION_RENAMED_NEW_NAME : S := S + 'Переименование файла. Новое имя.';
        else
          S := S + 'Незарегистрированное действие!';
        end;
        SetLength(Ws, PFni^.FileNameLength div SizeOf(WideChar));
        CopyMemory(Pointer(Ws), @PFni^.FileName, PFni^.FileNameLength);
 
 
        S := S + #13#10'Имя файла (папки): ' + Ws+ #13#10'Дата и время: '+FormatDateTime('dd.mm.yyyy"-"hh:nn:ss', Now);
        //Добавляем сведения в Мемо.
 
        if  (PFni^.Action=FILE_ACTION_ADDED)and (Form2.CheckBox2.Checked=false) then    
        S:='';
        if  (PFni^.Action=FILE_ACTION_REMOVED)and (Form2.CheckBox3.Checked=false) then    
        S:='';
        if  (PFni^.Action=FILE_ACTION_MODIFIED)and (Form2.CheckBox4.Checked=false) then     
        S:='';
        if  (PFni^.Action=FILE_ACTION_RENAMED_NEW_NAME)and (Form2.CheckBox5.Checked=false) then    
        S:='';
        if  (PFni^.Action=FILE_ACTION_RENAMED_OLD_NAME)and (Form2.CheckBox5.Checked=false) then     
        S:='';
        Memo3.Lines.Add(S);
        Memo1.Lines.Add(S);
        SaveLog;
 
 
        for i := 0 to Memo1.Lines.Count - 1000 do
          Memo1.Lines.Delete(0);
        PFniPrev := PFni;
        Inc(PByte(PFni), PFni^.NextEntryOffset);
      until PFniPrev^.NextEntryOffset = 0;
      FDmThr.FBuffSize := 0;
    end;
  finally
    ReleaseMutex(FHMtxBuff);
  end;
end;
 
procedure TForm1.DmTerminate(Sender: TObject);
var
  Err : Integer;
begin
  Err := FDmThr.FErr;
  Memo2.Lines.Add(FormatDateTime('dd.mm.yyyy"-"hh:nn:ss', Now) + '. Монитор остановлен.');
  Memo4.Lines.Add(FormatDateTime('dd.mm.yyyy"-"hh:nn:ss', Now) + '. Монитор остановлен.');
  SaveMon;
  if Err <> 0 then  begin
    Memo2.Lines.Add(Format('При работе монитора возникла ошибка.'
      + ' Код: %d, сообщение:'#13#10'%s', [Err, SysErrorMessage(Err)]));
      Memo4.Lines.Add(Format('При работе монитора возникла ошибка.'
      + ' Код: %d, сообщение:'#13#10'%s', [Err, SysErrorMessage(Err)]));
      SaveMon;
      end;
  FDmThr := nil;
end;
 
   procedure Tform1.BtnDmStartClick(Sender: TObject);
   var
   drive:string;
   Ini: Tinifile;
   force,hide:boolean;
    begin
    Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'MyIni.ini');
  hide:=Ini.ReadBool('general','hide', true);
  force:=Ini.ReadBool('general','force', true);
    if (hide=true) then begin
    force:=false;
    end
    else
    begin
    if (force=true) then begin   
 
      if not SelectDirectory(Drive, [sdAllowCreate, sdPerformCreate, sdPrompt], 0) then
      Exit;
      if not DirectoryExists(Drive) then begin
        MessageBox(Handle, 'Заданный путь не найден. Действие отменено.',
        'Отмена', MB_OK + MB_ICONWARNING + MB_APPLMODAL);
        Exit;
      end
      else                           
        form1.start('C:\cd\');
      end
      else
      ShowMessage('Включите ручной режим');
    end;
     end;
 
procedure Tform1.Start(Drive:string);
var
hide:boolean;
begin
 
   Fpath:=Drive;
   if (hide=false) then begin
   end;
     ShowMessage(Fpath);
 
 
  Memo2.Lines.Add('--------------------------------------------------');
  Memo4.Lines.Add('--------------------------------------------------');
  SaveMon;
 
  if FHMtxBuff = 0 then begin
    FHMtxBuff := CreateMutex(nil, True, nil);
    ReleaseMutex(FHMtxBuff);
  end;
 
  FDmThr := TDmThr.Create(True);
  FDmThr.FreeOnTerminate := True; 
  FDmThr.OnTerminate := DmTerminate; 
  FDmThr.FPath := FPath;
  FDmThr.FHMtxBuff := FHMtxBuff; 
  FDmThr.FHNotify := Handle; 
  FDmThr.FWMNotify := WMNotify;
  FDmThr.Resume;
 
  Memo2.Lines.Add(FormatDateTime('dd.mm.yyyy"-"hh:nn:ss', Now) +  '. Монитор запущен.');
  Memo2.Lines.Add('Путь: ' + FPath);
 
  Memo4.Lines.Add(FormatDateTime('dd.mm.yyyy"-"hh:nn:ss', Now) +  '. Монитор запущен.');
  Memo4.Lines.Add('Путь: ' + FPath);
   SaveMon;
 
end;
 
 
procedure TForm1.Stop(Sender: TObject);
var
  i, ResWait : Integer;
  HDm : THandle;
  Btn : TButton;
begin
  Btn := TButton(Sender);
  if Btn <> nil then
    Btn.Enabled := False;
  try
   
    if FDmThr = nil then
      Memo2.Lines.Add('Исходное состояние: монитор не работает.')
    else begin
    
      HDm := FDmThr.Handle;
      
      FDmThr.Terminate;
      
      i := 0;
      repeat
        Inc(i);
        Application.ProcessMessages;
        ResWait := WaitForSingleObject(HDm, 100);
      until (i = 10) or (ResWait = WAIT_OBJECT_0);
    
      if ResWait = WAIT_TIMEOUT then begin
        TerminateThread(HDm, 0);
        Memo2.Lines.Add(FormatDateTime('dd.mm.yyyy"-"hh:nn:ss:zzz', Now)
          + '. Монитор остановлен принудительно.');
        
        FreeAndNil(FDmThr);
      end;
    end;
  finally
    if Btn <> nil then
      Btn.Enabled := True;
  end;
end;
 
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  
  BtnDmStopClick(nil);
  Action := caFree;
end;
...
rocedure TForm1.FormCreate(Sender: TObject);
var
 Ini: Tinifile;
 hide:boolean;
begin
  Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'MyIni.ini');
   hide:=Ini.ReadBool('general','hide', false);
  if (hide=true) then Form1.BtnDmStart.Click;
end;
 
function GetDrive(pDBVol: PDevBroadcastVolume): string;
 var
   i: Byte;
   Maske: DWORD;
 begin
   if (pDBVol^.dbcv_flags and DBTF_Media) = DBTF_Media then
   begin
     Maske := pDBVol^.dbcv_unitmask;
     for i := 0 to 25 do
     begin
       if (Maske and 1) = 1 then
         Result := Char(i + Ord('A'));
       Maske := Maske shr 1;
     end;
   end
   else
  if (pDBVol^.dbcv_flags and DBTF_Remove) = DBTF_Remove then
    begin
    Maske := pDBVol^.dbcv_unitmask;
    for i := 0 to 25 do
    begin
      if (Maske and 1) = 1 then
        Result := Char(i + Ord('A'));
      Maske := Maske shr 1;
    end;
  end;
end;
 
 
 
 procedure TForm1.WMDeviceChange(var Msg: TMessage);
 var
   Drive: string;
   VolumeName,
  FileSystemName : array [0..MAX_PATH-1] of Char;
  VolumeSerialNo : DWord;
  MaxComponentLength,FileSystemFlags: Cardinal;
  p:PChar;
  tom:char;
  index:word;
 begin
 
   case Msg.wParam of
     DBT_DeviceArrival:
       if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
       begin
         Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
         p:=pchar(drive+':\');
        GetVolumeInformation(p, VolumeName,MAX_PATH,@VolumeSerialNo,
        MaxComponentLength,FileSystemFlags, FileSystemName,MAX_PATH);
        Memo3.Lines.Add('--------------------------------------------------');
        Memo3.Lines.Add('Обнаружено новое устройство');
        case GetDriveType(p) of
          0: Memo3.Lines.Add('The drive type cannot be determined');
          DRIVE_REMOVABLE: Memo3.Lines.Add('USB накопитель');
          DRIVE_FIXED: Memo3.Lines.Add('The disk cannot be removed');
          DRIVE_REMOTE: Memo3.Lines.Add('The drive is remote (network) drive');
          DRIVE_CDROM: Memo3.Lines.Add('CD/DVD диск');
          DRIVE_RAMDISK: Memo3.Lines.Add('RAM Disk');
        end;
        Memo3.Lines.Add('Метка тома: '+Drive);
        Memo3.Lines.Add('Название тома: '+VolumeName);
        Memo3.Lines.Add('Серийный номер: $'+IntToHex(VolumeSerialNo,8));
        Memo3.Lines.Add('CompLen: '+IntToStr(MaxComponentLength));
        Memo3.Lines.Add('Flags: $'+IntToHex(FileSystemFlags,4));
        Memo3.Lines.Add('Файловая система: '+FileSystemName);
        Memo3.Lines.Add('--------------------------------------------------');
         if (form2.CheckBox6.Checked=true) then else
 
      begin
      tom:=(Drive[1]);
      //ShowMessage(tom);
        aTh[tom] := tnew.Create(true);
        aTh[tom].FreeOnTerminate := True;
        aTh[tom].priority := tplowest;
        aTh[tom].s:= Drive+':\';
        aTh[tom].resume;
        ShowMessage(tom);
      end;
  end;
     DBT_DeviceRemoveComplete:
       if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DevTyp_Volume then
       begin
         Drive := GetDrive(PDevBroadcastVolume(Msg.lParam));
          GetVolumeInformation(p,VolumeName,MAX_PATH,@VolumeSerialNo,
        MaxComponentLength,FileSystemFlags, FileSystemName,MAX_PATH);
        Memo3.Lines.Add('--------------------------------------------------');
        Memo3.Lines.Add('Удалено устройство');
        Memo3.Lines.Add('Метка тома: '+Drive);
        Memo3.Lines.Add('--------------------------------------------------');
         //showMessage('Устройство извлечено из ' + Drive);
         //form1.Stop(nil);
 
       end;
   end;
 end;
 
 procedure TForm1.BtnDmStopClick(Sender: TObject);
begin
form1.Stop(nil);
end;
 
procedure tnew.addstr;
begin
form1.start(s);
end;
 
procedure tnew.execute;
begin
synchronize(addstr); 
 
end;
Насчёт оптимизации кода, я всё прекрасно понимаю, просто очень тороплюсь, обязательно поправлю позднее
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.07.2017, 16:00
Ответы с готовыми решениями:

Отслеживание изменения картинки
Добрый день. Пытаюсь отследить изменения в картинке следующим методом: // Получаем картинку...

Отслеживание изменения стороннего приложения для блокировки
Здравствуйте. Нужен совет. Надо сделать программу, в которая бы запускалась с пользователем...

Отслеживание изменения файлов
Добрый день! Подскажите, как можно получить &quot;сигнал&quot; о том что чужое приложение, открывшее файл,...

Отслеживание изменения файлов.
Подскажите пожалуйста, как можно отследить время изменения файлов в папке, учитывая, что их там...

10
5583 / 4433 / 1080
Регистрация: 29.08.2013
Сообщений: 27,729
Записей в блоге: 3
28.07.2017, 11:50 2
Цитата Сообщение от extzzy Посмотреть сообщение
Вот в этом у меня и проблема.
а проблема то в чем? где вопрос?

зачем кидать весь код без пояснения что и где не работает?
0
Модератор
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
28.07.2017, 13:10 3
У тебя одна переменная FDmThr на все потоки что ли?
И непонятно зачем нужен tnew.
0
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 5
28.07.2017, 14:45  [ТС] 4
Цитата Сообщение от qwertehok Посмотреть сообщение
зачем кидать весь код без пояснения что и где не работает?
Комментарии при копировании превращаются в абракадабру)
Цитата Сообщение от FIL Посмотреть сообщение
У тебя одна переменная FDmThr на все потоки что ли?
И непонятно зачем нужен tnew.
Да, вовсе не нужен. Прикрепил проект, там с комментариями и без tnew.
Мониторинг работает, но только с последним подключенным устройством, вопрос остается тот-же как сделать наблюдение сразу за несколькими устройствами?
Вложения
Тип файла: 7z potoki.7z (198.7 Кб, 8 просмотров)
0
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 5
28.07.2017, 14:49  [ТС] 5
Последнее что я сделал, точнее попытался сделать это массив из потоков. Т.е. при подключении устройства должен автоматически создаваться поток с меткой тома и соотвественно мониторить)
0
5583 / 4433 / 1080
Регистрация: 29.08.2013
Сообщений: 27,729
Записей в блоге: 3
28.07.2017, 15:58 6
что за бред у вас в потоке? что за Showmessage? что за мемо?
поток к VCL обращается только через синхронизацию. отдаете потоку букву и все, поток работает

и опять вы не пишите в чем именно проблема
0
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 5
28.07.2017, 16:04  [ТС] 7
Цитата Сообщение от qwertehok Посмотреть сообщение
и опять вы не пишите в чем именно проблема
Цитата Сообщение от extzzy Посмотреть сообщение
Мониторинг работает, но только с последним подключенным устройством, вопрос остается тот-же как сделать наблюдение сразу за несколькими устройствами?
Вроде написал
Цитата Сообщение от qwertehok Посмотреть сообщение
поток к VCL обращается только через синхронизацию
Если поток обращается к vcl только через синхронизацию, соотвественно на форме ничего не должно меняться, если нет синхронизации?
0
5583 / 4433 / 1080
Регистрация: 29.08.2013
Сообщений: 27,729
Записей в блоге: 3
28.07.2017, 16:13 8
Цитата Сообщение от extzzy Посмотреть сообщение
вопрос остается тот-же как сделать наблюдение сразу за несколькими устройствами?
запустить столько правильных потоков сколько нужно

Цитата Сообщение от extzzy Посмотреть сообщение
Вроде написал
а как вам ответить? переписать ваш код на правильный?

Цитата Сообщение от extzzy Посмотреть сообщение
соотвественно на форме ничего не должно меняться, если нет синхронизации?
конечно, поток работает где-то там. просто работает и делает свое дело.
0
0 / 0 / 0
Регистрация: 03.04.2015
Сообщений: 5
28.07.2017, 16:15  [ТС] 9
Цитата Сообщение от qwertehok Посмотреть сообщение
а как вам ответить? переписать ваш код на правильный?
Да неет, я же для этого сюда и написал, чтобы вы мне указали ошибки. Если бы я хотел чтобы мне переписали я бы просто заплатил
0
5583 / 4433 / 1080
Регистрация: 29.08.2013
Сообщений: 27,729
Записей в блоге: 3
28.07.2017, 16:21 10
без потоков у вас работает?

отладьте работу с потоками, уберите все лишнее
0
Cyborg Drone
31.07.2017, 11:37     Отслеживание создания/изменения файлов на накопителях (cd/usb)
  #11

Не по теме:

Цитата Сообщение от extzzy Посмотреть сообщение
Комментарии при копировании превращаются в абракадабру)
Перед копированием переключайтесь на русскую раскладку.

0
31.07.2017, 11:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2017, 11:37
Помогаю со студенческими работами здесь

Отслеживание создания файлов чужим процессом
Здравствуйте. Возникла проблемка с отслеживанием создания новых файлов в определенной папке чужим...

Индексирование файлов по дате создания и изменения
По моему, проблема именно в типе индексирования по умолчания. Когда переношу обновленные файлы с...

Считывание данных о USB накопителях, которые хранятся в реестре
Здравствуйте! Проблема следующая: необходимо считывать данные о USB накопителях, которые хранятся в...

Сбор файлов на всех накопителях и отправка через интернет
задача: собрать со всех накопителей (жесткий диск + флешки) на компе файлы формата .doc и .docx....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на Go/Golang
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C#
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru