В чем парадокс?
Если SIZE = 1 то поток вторичный НЕ создается (при отсутствии функции Sleep() ), следовательно запись в файл не происходит.
Подскажите в чем дело, компилятору не хватает время запустить поток без функции Sleep() ?
Спасибо.
#include <process.h>
#include <iostream>
#include <conio.h>
using namespace std;
HANDLE thread=NULL;
HANDLE mutex;
int M[12]= {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
FILE* f;
#define SIZE 5
struct Date {
unsigned y; // год
unsigned m; // месяц
unsigned d; // день
};
struct Dates {
int count; // количество имеющихся элементов в массиве
Date dates[SIZE];
} dts = {0};
Date buffer,tmp;
unsigned int WINAPI ThreadFunc(void* param);
Date GetDate(Date d);
void WriteDate(char* fname, Date buf);
void SuspendThread();
void ResumeThread();
void main()
{
dts.count =0;
for (int i= 0; i< SIZE; i++)
{
SuspendThread();
dts.dates[dts.count] = GetDate(tmp);
dts.count++;
ResumeThread();
Sleep(100);
}
}
void SuspendThread()
{
thread = NULL;
}
void ResumeThread()
{
if(thread == NULL)
{
thread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void*)&dts,0, NULL);
}
else
{
printf("Rabotaet!\n");
getch();
}
}
unsigned int WINAPI ThreadFunc(void* param)
{
Dates* p = (Dates*)param;
/*if ((p->count-1) == SIZE)
return 1; // конец программы
*/
WriteDate("f.txt", p->dates[p->count-1]);
return 0;
}
void WriteDate(char* fname, Date buf)
{
int i =0;
Date rec_date;
f= fopen(fname, "a+b");
if (!f) {
printf("Error with opening the file!");
exit(1);
}
fwrite(&buf, sizeof(rec_date), 1, f);
fclose(f);
}
Date GetDate(Date d)
{
char ins_date[12];
char* ptr;
int args[3];
int i = 0;
printf("Insert date in format \"dd.mm.yyyy\"\n");
scanf("%s", &ins_date);
ins_date[10] = '\0';
// разбиваем строку на подстроки
ptr = strtok(ins_date, ".");
args[i++] = atol(ptr);
for (i; i<3; i++)
{
args = atol(strtok(NULL,"."));
}
d.d = args[0];
d.m = args[1];
d.y = args[2];
return d;
}
ПыСы. Код SuspendThread() убил :D
А что это за основы, ну чисто из интереса?
Хм, и как это может помочь? С т.з. ОС мой процесс ничем не отличается от любого другого ибо планировщик работает с потоками (т.н. "мультипрограммная смесь").
Запуск потоков - сравнительно редкая операция, а нормальные люди как правило пользуются пулом нитей, в котором они уже готовы.
Вот я и спрашиваю, что за основы отладки многопоточных приложений?
Вот я и спрашиваю, что за основы отладки многопоточных приложений?
Думаю, имелось ввиду логирование.
Мэй би. Просто у меня обычно один способ - способ отладки пристальным взглядом.
Смотреть на код не мигая, как удав на кролика, в результате чего, код начинает нервничать, дрожать и от вибрации отваливается все, что плохо закреплено (баги).
ПыСы. Код SuspendThread() убил :D
А что в вопросе не понятно? Переформулировал: почему без Sleep() не работает программа?
Не знаю, поэтому спрашиваю. Вопрос вызвал интерес и мне хочется услышать грамотный ответ. Спасибо
Ты же уже ответил сам на свой вопрос ещё в топике. Да, процесс создания треда и процесс создания файла - небыстрые. Без Sleep не успевают.
Именно по этому "ResumeThread() запускает при входе на НОВУЮ итерацию цикла (wtf?)"
А вообще вместо Sleep надо использовать потоковую синхронизацию.
Слишком много букав :). Ну я всего-лишь-навсего говорил о чем-то таком. Применительно к той конкретной среде на которой работает программист (конкретному дебаггеру). Потому что если человек не понимает когда именно создается поток и когда потоки передают процессор друг другу (а это похоже тот случай) - ему необходимо понимать как такое отлаживать. Иначе будут вопросы подобные "а почему цикл шел-шел, а затем вдруг начал выполняться сначала, хотя никакого continue там нет" (вымышленно). Или (что более часто) - почему под дебаггером одно, а без дебаггера - второе. Ведь как организовывать параллельные треды, когда трейсится какой-то один из них, каждый отладчик может решать по своему.
Старайтесь делать это удалённой отладкой, на двух компах, т. к. в виндах иногда GDI подвисает, всё начинает тормозить, включая отладчик. Особенности сочетания "винда + MSVC".