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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2011, 21:16   #1
DarkMage
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 12
По умолчанию Двупоточная программа открытия текстового файла

Нужно:
Написать программу, которая построчно читает текстовый файл с диска и выводит в окно.
При чтении файла подсчитывать количество печатных знаков (за вычетом пробелов), а также количество слов.
Операции выполнить в виде двух отдельных потоков.
Последовательность действий синхронизовать при помощи одного из рассмотренных механизмов.

Я создал поток и реализовал синхронизацию с помощью критических секций. Я посчитал WM_PAINT как второй поток, правильно ли это? проверьте пожалуйста правильно ли работает программа, и вообще работает ли. На компьютере с win XP и VS10 возникает ошибка в начале запуска программы, на win 7 ошибок нет. Ошибка возникает либо в цикле while (GetMessage()), либо в ShowWindow(). Я там не изменял ничего.


поток

Код:
#include "stdafx.h"
#include <commdlg.h>
#include <fstream>
#include <vector>
#include "resource.h"
#include <string>я
#include <process.h>

static int q1=0,q2=0,kr,n,length;
std::string st;
static TCHAR name[256] = _T("");;
static OPENFILENAME file;
std::ifstream in;
std::ofstream out;
std::vector<std::string>::iterator it;
static std::vector<std::string> v;
CRITICAL_SECTION fs;

unsigned __stdcall MyThread1(void* param)
{
	EnterCriticalSection(&fs);
	while (getline(in,st)) 
	{
		if (length < st.length()) length = st.length();
		v.push_back(st);
		char* str_ptr = new char[st.length() + 1]();
		strcpy(str_ptr, st.c_str());
		char *k=strtok(str_ptr, " ");
		kr=0;
		while(k)
		{
			kr++;
			k=strtok(NULL, " ");
		}
		q1+=kr;
		q2+=st.length()-kr+1;
		delete[] str_ptr;
		
	}
	in.close();
	n = v.size();
	LeaveCriticalSection(&fs);
	InvalidateRect((HWND)param, NULL, TRUE);
	return 0;
}
DarkMage вне форума Ответить с цитированием
Старый 14.12.2011, 21:17   #2
DarkMage
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 12
По умолчанию

главная функция

Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR s[10], s2[10], str[40] = _T("Число слов: "), str2[40]= _T("Количество символов: ");
	int y, k;
	static HANDLE hThread;
	static int sx,sy,cx,iVscrollPos,iHscrollPos,COUNT,MAX_WIDTH;
	static SIZE size = {8, 16}; 
	switch (message)
	{
	case WM_CREATE: 
		file.lStructSize = sizeof(OPENFILENAME);
		file.hInstance = hInst;
		file.lpstrFilter = _T("Text\0*.txt");
		file.lpstrFile = name;
		file.nMaxFile = 256;
		file.lpstrInitialDir = _T(".\\");
		file.lpstrDefExt = _T("txt");
		file.lpstrTitle = _T("Открыть файл для чтения");
		file.Flags = OFN_HIDEREADONLY;	
		break;		
	case WM_SIZE:
		sx = LOWORD(lParam);
		sy = HIWORD(lParam);
		k = n - sy/size.cy;
		if (k > 0) COUNT = k; else COUNT = iVscrollPos = 0;
		SetScrollRange(hWnd, SB_VERT, 0, COUNT, FALSE);
		SetScrollPos (hWnd, SB_VERT, iVscrollPos, TRUE);
		k = length - sx/size.cx;
		if (k > 0) MAX_WIDTH = k; else MAX_WIDTH = iHscrollPos = 0;
		SetScrollRange(hWnd, SB_HORZ, 0, MAX_WIDTH, FALSE);
		SetScrollPos(hWnd, SB_HORZ, iHscrollPos, TRUE);
		break;
	case WM_VSCROLL :
		switch(LOWORD(wParam))
		{
			case SB_LINEUP   : iVscrollPos--; break;
			case SB_LINEDOWN : iVscrollPos++; break;
			case SB_PAGEUP   : iVscrollPos -= sy / size.cy; break;
			case SB_PAGEDOWN : iVscrollPos += sy / size.cy; break;
			case SB_THUMBPOSITION : iVscrollPos = HIWORD(wParam); break;
		}
		iVscrollPos = max(0, min(iVscrollPos, COUNT));
		if (iVscrollPos != GetScrollPos(hWnd, SB_VERT))
		{	
			SetScrollPos(hWnd, SB_VERT, iVscrollPos, TRUE);
			InvalidateRect(hWnd, NULL, TRUE);
		}
		break;
	case WM_HSCROLL : 
		switch(LOWORD(wParam))
		{
		 	case SB_LINEUP   : iHscrollPos--; break;
		 	case SB_LINEDOWN : iHscrollPos++; break;
		 	case SB_PAGEUP   : iHscrollPos -= 8; break;
		 	case SB_PAGEDOWN : iHscrollPos += 8; break;
		 	case SB_THUMBPOSITION : iHscrollPos = HIWORD(wParam); break;
		}
		iHscrollPos = max(0, min(iHscrollPos, MAX_WIDTH));
		if (iHscrollPos != GetScrollPos(hWnd, SB_HORZ))
		{	
			SetScrollPos(hWnd, SB_HORZ, iHscrollPos, TRUE);
			InvalidateRect(hWnd, NULL, TRUE);
		}
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
			case ID_FILE_OPEN : 
				if (!GetOpenFileName(&file)) return 1;
				in.open(name);
				InitializeCriticalSection(&fs);
				hThread = (HANDLE)_beginthreadex(NULL, 0, MyThread1, hWnd, 0, NULL);
				SendMessage(hWnd, WM_SIZE, 0, sy << 16 | sx);
				InvalidateRect(hWnd, NULL, TRUE);
				break;
	
		case IDM_EXIT: DestroyWindow(hWnd); break;
		default: return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		EnterCriticalSection(&fs);
		for(y=50,it=v.begin()+iVscrollPos;it!=v.end()&&y<sy;++it,y+=size.cy)
			if (iHscrollPos < it->length())
				TabbedTextOutA(hdc,0,y,it->data()+iHscrollPos,it->length()-
					iHscrollPos,0,NULL,0);
		_tcscat(str+9, _itot(q1, s, 10));
		TextOut(hdc,0,0,str, _tcsclen(str));
		_tcscat(str2+9, _itot(q2, s2, 10));
		TextOut(hdc,0,20,str2, _tcsclen(str2));
		LeaveCriticalSection(&fs);
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default: return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
DarkMage вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа печати текстового файла с размещением текста по 64 символов в строку без переноса слов rauhm6 Паскаль, Turbo Pascal, PascalABC.NET 0 06.12.2011 18:21
Проблема открытия файла kvg_ua Помощь студентам 5 05.03.2011 13:08
Открытия файла Ayubkhon Общие вопросы Delphi 3 08.06.2010 13:38
Открытия файла из listBox SergGhost Помощь студентам 3 21.05.2009 21:56
Программа печати текстового файла Maximauzer Паскаль, Turbo Pascal, PascalABC.NET 4 23.11.2008 02:00