Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293

«Не отвечает» com порт

05.01.2016, 19:23. Показов 4442. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

В цикле читаю com порт.
C++
1
2
3
4
do  {
   ReadFile(hCom, buf1, 1, &bytesRead, NULL);   // Начинаем чтение данных
   if (bytesRead>0){….     }
} while   (buf1[0]!=42 && buf1[0]!=33);   //Код символа * или !
В этот момент возникает сообщение от Windows «Не отвечает». На экране ничего не меняется и все бледное. Даже невозможно переместить форму в другое место экрана. В диспетчере задач памяти занимает не много, загрузка ЦП 0-5 %. Но сама программа работает.

Что делать? Хоть какие либо предположения. Где ошибка, в билдере или в винде? Откуда копать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2016, 19:23
Ответы с готовыми решениями:

Программирование COM-порта, порт некорректно отвечает на запросы
Добрый день форумчане. По долгу службы нужно написать софт для работы с gsm сетями. Использую для этого модем Novacom GNS-MC75iT ...

Открыть порт 4444 в брэндмауэре. Антивируса нет. провайдером порт открыт
Подскажите как открыть данный порт,все делал как тут http://windows.microsoft.com/ru-ru/windows/open-port-windows-firewall#1TC=windows-7....

В конфигурационном файле прописан порт, но пишет ошибку порт 80 занят другим приложением
Здравствуйте. Пишу решение с 2 проектами - сервер и клиент с дуплексным контрактом. Служба запускается нормально. Когда же запускаю...

35
Эксперт .NET
 Аватар для Rius
13834 / 7907 / 1709
Регистрация: 25.05.2015
Сообщений: 24,006
Записей в блоге: 14
09.01.2016, 12:41
Студворк — интернет-сервис помощи студентам
Витальич, нет, оно написано на работе.
0
09.01.2016, 12:46

Не по теме:

У меня была лицензия в 2008 году на teechart и она кончилась, что же тогда как всегда поступлю :D
PS у коллеги в том же году была куплена такая же на территории США и она работает, странно.

0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
09.01.2016, 14:58  [ТС]
SERIAL перевод Яндекса
Вложения
Тип файла: rar SERIAL перевод.rar (95.1 Кб, 3 просмотров)
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
11.01.2016, 15:20  [ТС]
Всем спасибо за советы!
На примере из «Работа с COM-портом с помощью потоков» добился нормальной работы программы.
Подскажите, как учесть общее время приема данных? Т.е. пока данные из порта принимаются, время «тикает». Кода данных нет, счетчик останавливается.
0
Эксперт .NET
 Аватар для Rius
13834 / 7907 / 1709
Регистрация: 25.05.2015
Сообщений: 24,006
Записей в блоге: 14
11.01.2016, 15:39
Сергей 190, первые байты приняты - время начала, обнаружен таймаут - время конца посылки, разница между ними - длительность посылки. Суммируем этим числа по мере поступления посылок.
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
11.01.2016, 15:43  [ТС]
Как и где обнаружить таймаут?
0
Эксперт .NET
 Аватар для Rius
13834 / 7907 / 1709
Регистрация: 25.05.2015
Сообщений: 24,006
Записей в блоге: 14
11.01.2016, 15:45
Код полностью покажите всем.
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
11.01.2016, 16:17  [ТС]
C++
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#include <stdio.h> // для sprintf
  #include <time.h>
 int start_time, end_time,Zashelka_time=1  ; // время
int Stop_file=1;
 
char *pcComPort="   Порт Не выбран", *NAM="Сборка 1   ";
 int TIMEOUT = 100000;
 int baudrate = 115200; //9600, 14400, 19200,38400, 57600, 115200
 HANDLE hCom;   //дескриптор порта
 DWORD  b,  bytesRead = 0;
 OVERLAPPED   ov;
void OpenPort2(char * pcComPort, HANDLE &hCom); //закрыть порт
 void   COMClose();
 #define BUFSIZE 255     //ёмкость буфера
unsigned char bufrd[BUFSIZE], bufwr[BUFSIZE]; //приёмный и передающий буферы
OVERLAPPED overlapped;      //будем использовать для операций чтения (см. поток ReadThread)
OVERLAPPED overlappedwr;        //будем использовать для операций записи (см. поток WriteThread)
bool fl=0;  //флаг, указывающий на успешность операций записи (1 - успешно, 0 - не успешно)
unsigned long counter;  //счётчик принятых байтов, обнуляется при каждом открытии порта
 
 //.............................. объявления потоков ...........................
class ReadThread : public TThread {     //поток для чтения последовательности байтов из COM-порта в буфер
private:
        void __fastcall Printing(); //вывод принятых байтов на экран и в файл
 protected:
        void __fastcall Execute();  //основная функция потока
 public:
        __fastcall ReadThread(bool CreateSuspended);    //конструктор потока
};
//.............................. реализация потоков ...........................
//............................... поток ReadThead .............................
ReadThread *reader;     //объект потока ReadThread
//---------------------------------------------------------------------------
//конструктор потока ReadThread, по умолчанию пустой
__fastcall ReadThread::ReadThread(bool CreateSuspended) : TThread(CreateSuspended)  {}
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){    }
 
//---------------------------------------------------------------------------
  void OpenPort2(char * pcComPort, HANDLE &hCom){
 DCB dcb;                //структура для общей инициализации порта DCB
 COMMTIMEOUTS timeouts;  //структура для установки таймаутов
 hCom = CreateFile(pcComPort, GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED, NULL);
// hCom = CreateFile(pcComPort, GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if(hCom == INVALID_HANDLE_VALUE)            //если ошибка открытия порта
  {
            hCom = 0;
            Zvuk(1);
            ShowMessage("Ошибка открытия порта");
   return;
  }
 //инициализация порта
 dcb.DCBlength = sizeof(DCB);   //в первое поле структуры DCB необходимо занести её длину, она будет использоваться функциями настройки порта для контроля корректности структуры
 //считать структуру DCB из порта
 if(!GetCommState(hCom, &dcb))  //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
  {
   COMClose();
    ShowMessage("Не удалось считать DCB");
   return;
  }
 //инициализация структуры DCB
 dcb.BaudRate = DWORD(baudrate);       //задаём скорость передачи 115200 бод
 dcb.fBinary = TRUE;                                    //включаем двоичный режим обмена
 dcb.fOutxCtsFlow = FALSE;                              //выключаем режим слежения за сигналом CTS
 dcb.fOutxDsrFlow = FALSE;                              //выключаем режим слежения за сигналом DSR
 dcb.fDtrControl = DTR_CONTROL_DISABLE;                 //отключаем использование линии DTR
 dcb.fDsrSensitivity = FALSE;                           //отключаем восприимчивость драйвера к состоянию линии DSR
 dcb.fNull = FALSE;                                     //разрешить приём нулевых байтов
 dcb.fRtsControl = RTS_CONTROL_DISABLE;                 //отключаем использование линии RTS
dcb.fAbortOnError = FALSE;                             //отключаем остановку всех операций чтения/записи при ошибке
 dcb.ByteSize = 8;                                      //задаём 8 бит в байте
dcb.Parity = 0;                                        //отключаем проверку чётности
 dcb.StopBits = 0;                                      //задаём один стоп-бит
//загрузить структуру DCB в порт
 if(!SetCommState(hCom, &dcb))  //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
  {
   COMClose();
   ShowMessage("Не удалось установить DCB");
  return;
  }
 //установить таймауты
 timeouts.ReadIntervalTimeout = 0;      //таймаут между двумя символами
 timeouts.ReadTotalTimeoutMultiplier = 0;   //общий таймаут операции чтения
 timeouts.ReadTotalTimeoutConstant = 0;         //константа для общего таймаута операции чтения
timeouts.WriteTotalTimeoutMultiplier = 0;      //общий таймаут операции записи
 timeouts.WriteTotalTimeoutConstant = 0;        //константа для общего таймаута операции записи
 //записать структуру таймаутов в порт
 if(!SetCommTimeouts(hCom, &timeouts))  //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
  {
   COMClose();
   ShowMessage("Не удалось установить тайм-ауты");
   return;
  }
 //установить размеры очередей приёма и передачи
 SetupComm(hCom,2000,2000);
 PurgeComm(hCom, PURGE_RXCLEAR);    //очистить принимающий буфер порта
reader = new ReadThread(false); //создать и запустить поток чтения байтов
 reader->FreeOnTerminate = true;        //установить это свойство потока, чтобы он автоматически уничтожался после завершения
}
 
 
 void  COMClose(){
 }
 
 //---------------------------------------------------------------------------
//главная функция потока, реализует приём байтов из COM-порта
void __fastcall ReadThread::Execute()
{
 COMSTAT comstat;       //структура текущего состояния порта, в данной программе используется для определения количества принятых в порт байтов
 DWORD btr, temp, mask, signal; //переменная temp используется в качестве заглушки
 
 overlapped.hEvent = CreateEvent(NULL, true, true, NULL);   //создать сигнальный объект-событие для асинхронных операций
 SetCommMask(hCom, EV_RXCHAR);                              //установить маску на срабатывание по событию приёма байта в порт
 while(!Terminated)                     //пока поток не будет прерван, выполняем цикл
  {
   WaitCommEvent(hCom, &mask, &overlapped);                 //ожидать события приёма байта (это и есть перекрываемая операция)
   signal = WaitForSingleObject(overlapped.hEvent, INFINITE);   //приостановить поток до прихода байта
   if(signal == WAIT_OBJECT_0)                      //если событие прихода байта произошло
    {
     if(GetOverlappedResult(hCom, &overlapped, &temp, true)) //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
      if((mask & EV_RXCHAR)!=0)                 //если произошло именно событие прихода байта
       {
        ClearCommError(hCom, &temp, &comstat);      //нужно заполнить структуру COMSTAT
        btr = comstat.cbInQue;                              //и получить из неё количество принятых байтов
        if(btr)                                     //если действительно есть байты для чтения
        {
//       ReadFile(hCom, bufrd, btr, &temp, &overlapped);     //прочитать байты из порта в буфер программы
         ReadFile(hCom, buf2, btr, &temp, &overlapped);     //прочитать байты из порта в буфер программы
 
         counter+=btr;                                          //увеличиваем счётчик байтов
         Synchronize(Printing);                             //вызываем функцию для вывода данных на экран и в файл
        }
       }
    }
  }
 CloseHandle(overlapped.hEvent);        //перед выходом из потока закрыть объект-событие
}
 
//-Читать до конца файла------------------------------------------------------
void __fastcall TForm1::BitBtn3Click(TObject *Sender) {
VXOD=2;
Form1->CheckBox1->Caption="Обрабатывать STOP из файла", Form1->CheckBox1->Refresh();//  clBtnFace
int Zashelka=1;//защелка
   if (Zashelka_time==1) {
   start_time = time(NULL);  // начальное время
   Zashelka_time=0;
   }
    end_time = time(NULL);  // конечное время
    int search_time = end_time - start_time; // искомое время
  Form1->Label25->Caption= search_time,   Form1->Label25->Refresh();
 
// вход из АВАРИЙНОГО выхода
 if (Vixod==0 && Zashelka==1){ //до конца строки
 Zashelka=0;
 X_vix=X_real+X_gl, Y_vix=Y_real+Y_gl,Z_vix=Z_real+Z_gl;
 
 Gotovim_Dannie();
 
      Stroka_v_port();  //Передаём ДАННЫЕ
if (Vixod==1 && VXOD==2) X_gl= X_f, Y_gl=Y_f, Z_gl=Z_f;// штатный выход
if (Vixod==0 && VXOD==2) X_gl=X_gl+X_real, Y_gl=Y_gl+Y_real, Z_gl=Z_gl+Z_real;// аварийный выход
           Label15->Caption= (X_gl), Label15->Refresh();
           Label16->Caption= (Y_gl), Label16->Refresh();
           Label17->Caption= (Z_gl), Label17->Refresh();
           Zvuk(7); // 7 вход из АВАРИЙНОГО выхода
   }
// вход из ШТАТНОГО выхода
 if (Vixod==1 && Zashelka==1){ //до конца файла
  if (Simvol_Vixoda==42){
  Stop_file=1;
     Tek_str++;
     Analiz_stroki();
     Gotovim_Dannie();
  char *lb10="                                                            ";
 strcpy (lb10,G_xod_im);
 Form1->Label10->Caption= lb10,   Form1->Label10->Refresh();
 Label24->Caption="режим перемещения", Label24->Refresh(); //if (G_sverl==0){  // режим перемещения
//end_time=time(NULL);// конечное время  повтор  int search_time=end_time-start_time; // искомое время  //Form1->Label25->Caption=search_time,   Form1->Label25->Refresh();
if (X_f!=X_gl || Y_f!=Y_gl || Z_f!=Z_gl)Stroka_v_port();  //Передаём ДАННЫЕ
   Label10->Refresh();
 Zvuk(5); //конец обработки строки// режим перемещения закончен
}
 
   if (Tek_str>=(Strok_vsego)){// Если конец файла
      Tek_str=(Strok_vsego);
      Zvuk(6); // 6 конец файла
      }
}
}
 
 //---------------------------------------------------------------------------
void __fastcall ReadThread::Printing()  {   //выводим принятые байты на экран
 Form1->Memo2->Lines->Add(buf2); //выводим принятую строку в Memo
 int LEN= strlen(buf2); // определяем длину строки
 Simvol_Vixoda=   buf2[LEN-1] ;
   int Rejim, Xpr=0, Ypr=0, Zpr=0;
   X_tek=0,  Y_tek=0,  Z_tek=0;
   znakX=1,  znakY=1,  znakY=1;
 for (int t = 0; t < LEN-1; t++) {
    if (buf2[t]==120) znakX=-1, Rejim=1;   //Код символа "x"
    if (buf2[t]==88)  znakX= 1, Rejim=1;   //Код символа "X"
    if (buf2[t]==121) znakY=-1, Rejim=2;   //Код символа "y"
    if (buf2[t]==89)  znakY= 1, Rejim=2;   //Код символа "Y"
    if (buf2[t]==122) znakZ=-1, Rejim=3;   //Код символа "z"
    if (buf2[t]==90)  znakZ= 1, Rejim=3;   //Код символа "Z"
    if (buf2[t]=='S') Skvajnost=0,  Rejim=4;   //Код символа "S"
    if (buf2[t]=='T') Timpuls=0,  Rejim=5;   //Код символа "T"
 
     if (buf2[t]>=48 && buf2[t]<=57){
  if (Rejim==1)  Xpr=Xpr*10+(buf2[t]-48); //Накапливаем переменную "X"
  if (Rejim==2)  Ypr=Ypr*10+(buf2[t]-48); //Накапливаем переменную "Y"
  if (Rejim==3)  Zpr=Zpr*10+(buf2[t]-48); //Накапливаем переменную "Z"
  if (Rejim==4)  Skvajnost=Skvajnost*10+(buf2[t]-48); //Накапливаем переменную  Skvajnost
  if (Rejim==5)  Timpuls=Timpuls*10+(buf2[t]-48); //Накапливаем переменную   Timpuls
     }
}
if (Rejim==5) zam=Skvajnost+Timpuls;
 Form1->Edit1->Text=zam, Form1->Edit1->Refresh();
 
  X_real= Xpr*znakX,  Y_real= Ypr*znakY, Z_real= Zpr*znakZ;
  double X_ekran=0, Y_ekran=0, Z_ekran=0;
if (VXOD==2)X_ekran=X_real+X_gl, Y_ekran=Y_real+Y_gl, Z_ekran=Z_real+Z_gl;
if (VXOD==1)X_ekran=X_real, Y_ekran=Y_real, Z_ekran=Z_real;
Cvetomuzika();
 X_ekran=X_ekran/100,  Y_ekran=Y_ekran/100,   Z_ekran=Z_ekran/100 ;
Form1->Label3->Caption=X_ekran, Form1->Label3->Refresh();
Form1->Label4->Caption=Y_ekran, Form1->Label4->Refresh();
Form1->Label5->Caption=Z_ekran, Form1->Label5->Refresh();
          Xpr=0, Ypr=0,  Zpr=0;
 
 Form1->Label32->Caption=Simvol_Vixoda   ;
memset(buf2, 0, BUFSIZE);           //очистить буфер (чтобы данные не накладывались друг на друга)
 
if (Simvol_Vixoda=='*') {
  X_gl=X_gl+X_real, Y_gl=Y_gl+Y_real, Z_gl=Z_gl+Z_real;
    if (Stop_file!=0) {
  Tek_str++;
  Zvuk(5);
  Analiz_stroki();
  Gotovim_Dannie();
  Stroka_v_port();  //Передаём ДАННЫЕ
    }
}
if (Simvol_Vixoda=='!') { …  }
 
}
//---------------------------------------------------------------------------
0
Эксперт .NET
 Аватар для Rius
13834 / 7907 / 1709
Регистрация: 25.05.2015
Сообщений: 24,006
Записей в блоге: 14
12.01.2016, 08:50
Сергей 190, у вас это не будет известно. Можно просто подсчитывать принятый объём данных.
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
12.01.2016, 10:59  [ТС]
Почему неизвестно? Из-за большого TIMEOUT = 100000;?
Я думаю, его и так нужно уменьшить. Это значение осталось от предыдущей версии.
По принятым данным считать нельзя. Если работают три мотора на максимальной скорости – это больше 12000 байт за 0,8 секунды. Если один и медленно – 300 байт в сек.
И как и где измерить этот таймаут? Как определить, что порт перестал отвечать?
0
Эксперт .NET
 Аватар для Rius
13834 / 7907 / 1709
Регистрация: 25.05.2015
Сообщений: 24,006
Записей в блоге: 14
12.01.2016, 11:07
Потому что у вас не запрос-ответ.
Что такое для вас "общее время приёма данных" и что оно вам даст?
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
12.01.2016, 11:40  [ТС]
Понял. Буду делать по старому. Запускать счетчик после WriteFile и останавливать после «стопов». Просто у меня этих стопов много и они разные. Хотелось упростить.
Пока приходят данные – это моторы крутятся. А когда я меняю инструмент или сметаю стружку – это простой.
Программа может выполняться несколько часов. По времени я определяю, на каком этапе нахожусь.
0
Эксперт .NET
 Аватар для Rius
13834 / 7907 / 1709
Регистрация: 25.05.2015
Сообщений: 24,006
Записей в блоге: 14
12.01.2016, 11:42
Пока данные приходят, можно увеличивать счётчик прошедшего времени на 1 секунду. Но не чаще 1 раза в секунду.
0
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
12.01.2016, 11:47  [ТС]
Пока не представляю, как это сделать?
0
Эксперт .NET
 Аватар для Rius
13834 / 7907 / 1709
Регистрация: 25.05.2015
Сообщений: 24,006
Записей в блоге: 14
12.01.2016, 11:51
Тривиально.

Пришла посылка.
Если последний раз посылка пришла не в эту секунду, увеличить счётчик времени наработки на 1 секунду.
Запомнить текущее время как последнее время приёма.

Смотрите функции для даты/времени в вашем языке программирования.
1
 Аватар для Сергей 190
365 / 348 / 74
Регистрация: 18.03.2015
Сообщений: 1,293
12.01.2016, 12:01  [ТС]
Логично. Спасибо за подсказку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.01.2016, 12:01

В порт в среднем приходит 3 корабля в день. Какова вероятность того, что в порт в день придет 2 корабля; 4 корабля?
помогите решить пожалуйста В порт в среднем приходит 3 корабля в день. Какова вероятность того, что в порт в день придет 2 корабля;...

Яндекс не отвечает
Помогите, плиз! Уже больше недели нет с Яндекса ни одного посетителя. Суппорт не отвечает. Я даже не знаю за что забанили. В...

GDB не отвечает
Есть рабочий код: ...

Textarea не отвечает)
Здравствуйте! Не могу понять что не так с textarea.. Не могу добавить и удалять её value. Есть функция, которая при клике в поле убирает...

Explorer - не отвечает
Помогите у меня на нотбуке постоянно вылазит ошибка &quot;explorer.exe не отвечает&quot; что можно сделать??? вирусов нету! ноут не старый! Windows...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru