Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
12 / 12 / 0
Регистрация: 29.09.2010
Сообщений: 60
1

Поток перестает видить содержимое файла.

16.11.2010, 04:51. Показов 773. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу лабораторную, в которой один поток должен передать данные другому в несколько приемов. Передачу осуществляю через файл. Возникла проблема, что на втором цикле считывания из файла, процесс приемник считает, что файл пустой, хотя это не так.
Код отправителя:
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
void __fastcall rthr::Upd()
{Form1->Memo1->Lines->Add(text);}
 
void __fastcall rthr::Execute()
{
event[0]=CreateEvent(NULL, FALSE, FALSE, "event1");
event[1]=CreateEvent(NULL, FALSE, FALSE, "event2");
event[2]=CreateEvent(NULL, FALSE, FALSE, "terminate");
ifstream in;
ofstream out;
out.open("temp.txt");
text="Поток 1 считывает данные из входного файла";
Synchronize(Upd);
in.open("in.txt");
float q;
int i=0;
while(!in.eof()){
 i++;
 in>>q;
 if(in.eof()){i--; break;}
 out<<q+100<<endl;
 if(i==1000){
  i=0;
  out.close();
  text="Поток 1 отправляет данные второму потоку";
  Synchronize(Upd);
  SetEvent(event[0]);
  WaitForMultipleObjects(1, &event[1], false, INFINITE);
  out.open("temp.txt");
  text="Поток 1 считывает данные из входного файла";
  Synchronize(Upd);
 
 }
}
if((i!=1000)&&(i!=0)){
 out.close();
 text="Поток 1 отправляет данные второму потоку";
 Synchronize(Upd);
 SetEvent(event[0]);
 WaitForMultipleObjects(1, &event[1], false, INFINITE);
}
text="Поток 1 завершил пересылку данных";
Synchronize(Upd);
SetEvent(event[2]);
out.close();
in.close();
for(int i=0; i<3; i++)CloseHandle(event[i]);
text="Поток 1 завершил работу";
Synchronize(Upd);
}
Код приемника:
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
void __fastcall wthr::Upd()
{Form1->Memo1->Lines->Add(text);}
 
void __fastcall wthr::Execute()
{
event[0] = OpenEvent(EVENT_ALL_ACCESS, FALSE, "event1");
event[1]=OpenEvent(EVENT_ALL_ACCESS, FALSE, "event2");
event[2]=OpenEvent(EVENT_ALL_ACCESS, FALSE, "terminate");
HANDLE ev[2]= {event[2], event[0]};
ifstream in1;
ofstream out1;
out1.open("out.txt");
while(true){
int code = WaitForMultipleObjects(2, ev, false, INFINITE);
if(code==WAIT_OBJECT_0)break;
text="Поток 2 принимает данные от первого потока";
Synchronize(Upd);
in1.open("temp.txt");
float q;
 while(!in1.eof()){
  in1>>q;
  if(in1.eof())break;
  out1<<q+1000<<endl;
 }
 text="Поток 2 готов принять следующую порцию данных";
 Synchronize(Upd);
 in1.close();
 SetEvent(event[1]);
}
out1.close();
in1.close();
for(int i=0; i<3; i++)CloseHandle(event[i]);
text="Поток 2 завершил работу";
Synchronize(Upd);
}
Путем прогона по шагам было выяснено, что процесс на втором круге передачи данных не заходит в while на 18ой строчке кода приемника, хотя в то же время при простом открытии файла там обнаруживаются все необходимые данные.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2010, 04:51
Ответы с готовыми решениями:

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

Поток не видит содержимое
Всем привет! Начал писать программу столкнулся с проблемой: Начали создаваться потоки Поток...

Не получается занести содержимое List в поток
Не получается занести содержимое List в поток Stream1. В Memo1 ничего не происходит(( procedure...

Записать в текстовый файл содержимое Edit, и прочитать содержимое файла в Memo
Создать приложение которое создает текстовый файл текстовый файл text.txt записывает в него текст...

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

Копировать содержимое одного указанного файла в другой указанный файл, дописывая, а не стирая его содержимое
Dragokas, Помогите пожалуйста с заданием! Задание 3. Написать командный файл, копирующий...

Создать поток сжатия GZipStream, и перенести данные из открытого файла в поток GZipStream
Здравствуйте. Объясните мне пожалуйста следующую вещь: Необходимо открыть файл для чтения. Создать...

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции.
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный файл). Через поток....

Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла
3)Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла.

Даны два текстовых файла. Добавить в начало первого файла содержимое второго файла.
Даны два текстовых файла. Добавить в начало первого файла содержимое второго файла.

Даны два текстовых файла. Добавить в начало первого файла содержимое второго файла
Даны два текстовых файла. Добавить в начало первого файла содержимое второго файла


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru