C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: План реализации программы  (Прочитано 12782 раз)
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


План реализации программы
« : 11 Апрель 2014, 15:28:27 »

Я хочу написать программу, которая по расписанию запускала бы на выполнение видео файлы.
Например, в 10 утра запускается файл file1.mp4, в 12 часов дня запускался бы второй файл file2.mp4, а первый файл file1.mp4 переставал бы воспроизводиться. Программа должна работать круглые сутки и запускать эти файлы по расписанию.
Я хочу спланировать правильный подход к реализации такой программы. Вот первые мои мысли, поправьте или скажите, как сделать лучше и правильнее.
Мои планируемые шаги:
1. Храню файлы в INI:
[FILE1]
time = 10.00
name = file1.mp4

[FILE2]
time = 12.30
name = file2.mp4

******

[FILE9]
time = 20.00
name = file9.mp4

[FILE91]
time = 21.30
name = file91.mp4

и т.д.

2. При старте программы гружу содержимое INI в контейнер STL map. Контейнер отсортирую по именам файла, вторым значением map будет время.

3. Теперь надо наверно запустить таймер, который будет постоянно сравнивать текущее время с временами из контейнера. Как-то делать анализ и выключать один файл и запускать нужный.

Правильно ли так реализовывать такую программу?
3-й пункт вообще пока в тумане как реализовать.

Записан
serg76
Участник


Сказали спасибо: +38/-2
Offline

Сообщений: 575


Re: План реализации программы
« Ответ #1 : 11 Апрель 2014, 16:32:40 »

Цитата: SilverFish от 11 Апрель 2014, 15:28:27
в 10 утра запускается файл file1.mp4, в 12 часов дня запускался бы второй файл file2.mp4

продолжительность видео (file1.mp4, file2.mp4 ...) больше, меньше или до времени следующего запуска?
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #2 : 11 Апрель 2014, 16:48:18 »

Плеер, который будет воспроизводит видео будет настроен на воспроизведение без остановки. В нем будет нажата кнопка повторения видео. Например, запустилось видео продолжительностью 30 секунд. Видео отыграло и стало играть по новой и так по кругу. К примеру в 12.00 надо полностью заменить видео и новое видео начнет играть по кругу и длина у видео другая. Чтобы было понятнее - большой телевизор который крутит рекламные ролики в цикле без остановки.
Записан
Hex
Участник


Сказали спасибо: +16/-3
Offline

Сообщений: 38


Re: План реализации программы
« Ответ #3 : 11 Апрель 2014, 22:25:15 »

как часто будет менятся исходный INI?
и почему бы не сделать все в обычном планировщике за пару мин?
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #4 : 11 Апрель 2014, 23:03:27 »

Цитата: Hex от 11 Апрель 2014, 22:25:15
как часто будет менятся исходный INI?

А какая разница? Остановили программу, поменяли INI, запустили программу.

Цитировать
и почему бы не сделать все в обычном планировщике за пару мин?

Приложение для Windows это предварительный тест.
16 апреля выходит С++ Builder XE6 с поддержкой Андроид.
Стоят реальные телевизоры к ним присоединены HD плеера с ОС Андроид 4.2. MX плеера для Андроида крутят видео на этих телевизорах. Для смены видео приходиться все делать человеку вручную. Планирую такую программу создать для Андроида, но предварительно создаю тестовый вариант для Windows, чтобы понять общую концепцию.
« Последнее редактирование: 12 Апрель 2014, 00:08:09 от SilverFish » Записан
Hex
Участник


Сказали спасибо: +16/-3
Offline

Сообщений: 38


Re: План реализации программы
« Ответ #5 : 12 Апрель 2014, 00:01:57 »

общая структура
Код:
загрузить список из INI в массив [Имя, Время]
если пуст = выход
проверить наличие всех файлов, если нет = выход (или продолжить, выкинув из списка пустышки)
отсортировать массив по нарастанию времени

текущий_файл = получить_по_текущему_времени()
запуск_на_воспроизведение(текущий_файл)

main_loop
  пауза/проверка_на_условие_завершения
  новый_файл = получить_по_текущему_времени()
  if (текущий_файл != новый_файл)
    {
    текущий_файл = новый_файл
    запуск_на_воспроизведение(текущий_файл)
    }

завершение()

поиск по интервалам (оберните в func(), подставьте свои имена и не забывайте сбрасывать часть времени для даты при сравнении)
Код:
TimeNow = Now()
for (int Index = 0; (RecCount) && (Index   {
  if (Index == 0)
    {
    TimeBegin = 00:00
    TimeEnd = RecItem[Index].Time
    if ((TimeBegin     }
  else if (Index == RecCount)
    {
    TimeBegin = RecItem[Index - 1].Time
    TimeEnd = 23:59
    if ((TimeBegin     }
  else
    {
    TimeBegin = RecItem[Index - 1].Time
    TimeEnd = RecItem[Index].Time
    if ((TimeBegin     }
  }
return -1;

единственная гадость = реализация запуск_на_воспроизведение() - сильно платформозависима
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #6 : 12 Апрель 2014, 09:55:37 »

Спасибо буду изучать.

Вопрос такой почему в моем коде возникает ошибка AV?
INI:
[FILE1]
time = 10:00:00
name = file1.mp4

[FILE2]
time = 12:30:00
name = file2.mp4

[FILE3]
time = 14:00:00
name = file3.mp4

[FILE4]
time = 16:30:00
name = file4.mp4


[FILE5]
time = 20:00:00
name = file5.mp4

Код
#include 
#pragma hdrstop
 
#include
#include
#include
 
#include "UnitMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
std::mapString, String> IniContent;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
String path = ExtractFilePath(Application->ExeName) + L"\\files.ini";
if(FileExists(path))
{
 std::auto_ptrTIniFile> FileINI(new TIniFile(path));
 std::auto_ptrTStringList> AlliniSection(new TStringList());
 FileINI->ReadSections(AlliniSection.get());
 
  for (int i = 0; i AlliniSection->Count; i++)
 {
  IniContent[FileINI->ReadString(AlliniSection->Strings[i], "time", "")] =
FileINI->ReadString(AlliniSection->Strings[i], "name", "");
 }
 
 //проверка
 std::mapString, String>::iterator It = IniContent.begin();
while (It != IniContent.end())
{
 Memo1->Lines->Add((*It).first + "=" + (*It).second);
  It++;
}
 
 //попытка поиска нужного диапазона времени c помощью алгоритма
 TDateTime T(Now());
 std::pairstd::mapString, String>::iterator,std::mapString, String>::iterator> ret;
 ret = IniContent.equal_range(T.TimeString());
 Memo1->Lines->Add("***");
 Memo1->Lines->Add(ret.first->first + "=" + ret.first->second); //ОШИБКА AV
 Memo1->Lines->Add(ret.first->second + "=" + ret.second->second);
 
}
else
{
 ShowMessage(L"Не найден файл files.ini");
 Application->Terminate();
}
 
}
//---------------------------------------------------------------------------
 
Записан
Hex
Участник


Сказали спасибо: +16/-3
Offline

Сообщений: 38


Re: План реализации программы
« Ответ #7 : 12 Апрель 2014, 10:52:57 »

Код:
std::pair<:map string>::iterator,std::map::iterator> ret;

 

K.I.S.S.
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: План реализации программы
« Ответ #8 : 12 Апрель 2014, 12:26:47 »

Цитата: SilverFish от 12 Апрель 2014, 09:55:37
Вопрос такой почему в моем коде возникает ошибка AV?
А почему я не вижу никакого AV?
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #9 : 12 Апрель 2014, 19:06:41 »

Спасибо, volvo877!
После твоего сообщения выключила студию, перегрузила компьютер - AV пропало.  Блин, потратила пол дня на это AV, но мысль перегрузить студию не приходила.

P.S.
Последняя строчка, не совсем корректная. Так надо:
Memo1->Lines->Add(ret.second->first + "=" + ret.second->second);

P.P.S.
В любом случая, я судя по всему, не понимаю работу equal_range  
Если к примеру сейчас 17.50 и содержимое Memo такое:
10:00:00=file1.mp4
12:30:00=file2.mp4
14:00:00=file3.mp4
16:30:00=file4.mp4
20:00:00=file5.mp4
21:00:00=file6.mp4

то мне казалось что я получу такой результат:
***
16:30:00=file4.mp4
20:00:00=file5.mp4
т.е. попаду в нужный диапазон времени от min до max. Дальше планировала запуск в данном случае file4.mp4

а я получаю реально такой диапазон:
20:00:00=file5.mp4
20:00:00=file5.mp4

Как правильно проанализировать текущее время и мой map?




« Последнее редактирование: 12 Апрель 2014, 19:20:58 от SilverFish » Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #10 : 12 Апрель 2014, 21:21:37 »

Окончательный код такой, посмотрите что могла напутать и что лучше переделать...  
INI:
[FILE1]
time = 10:06:00
name = file1.mp4

[FILE2]
time = 10:09:00
name = file2.mp4

[FILE3]
time = 10:21:00
name = file3.mp4

[FILE4]
time = 12:53:00
name = file4.mp4

[FILE5]
time = 19:42:00
name = file5.mp4

[FILE6]
time = 19:42:00
name = file6.mp4

Код
#include 
#pragma hdrstop
 
#include
#include
#include
 
#include "UnitMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
std::mapString, String> IniContent; //контейнер "время->имя файла"
String VideoFileName; //имя запущенного файла
std::mapString, String>::iterator ItTEMPSeach; //итератор для поиска по контейнеру map
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
 
//---------------------------------------------------------------------------
void Control()
{
String path = ExtractFilePath(Application->ExeName) + L"\\files.ini";
if(FileExists(path))
{
 std::auto_ptrTIniFile> FileINI(new TIniFile(path));
 std::auto_ptrTStringList> AlliniSection(new TStringList());
 FileINI->ReadSections(AlliniSection.get());
 
  if(AlliniSection->Count == 0)
  {
ShowMessage(L"Не найдено записей в файле настройки. Программа будет закрыта.");
Application->Terminate();
return;
  }
 
 IniContent.clear();
 
 for (int i = 0; i AlliniSection->Count; i++)
 {
  IniContent[FileINI->ReadString(AlliniSection->Strings[i], L"time", "")] =
FileINI->ReadString(AlliniSection->Strings[i], L"name", "");
 }
 
 TDateTime T(Now());
 String temptime = T.TimeString();
 //вставляем в map временное значение. Поскольку map сортирует автоматом время
 //будет вставлено в правильную позицию
 IniContent[temptime] = L"TEMP";
 //устанавливаем итератор на временное значение
 ItTEMPSeach = IniContent.find(temptime);
 
 //проверим что временное значение не попало на самое первое место
 std::mapString, String>::iterator It = IniContent.begin();
 if((*It).second == L"TEMP")
 //тогда поднинемся на первое реальное значение в контейнере map
  ItTEMPSeach++;
 else
 //иначе спустимся на один итератор вниз и встанем на реальное время в контейнере map
  ItTEMPSeach--;
 
 IniContent.erase(temptime); //теперь удаляем времнное значение из map
 
}
else
{
 ShowMessage(L"Не найден файл files.ini. Программа будет закрыта.");
 Application->Terminate();
}
}
 
//---------------------------------------------------------------------------
//СТАРТ
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
 Control();
 
 if(ItTEMPSeach == NULL)
 {
  ShowMessage(L"Не найден видео файл в файле настройки. Программа будет закрыта.");
  Application->Terminate();
  return;
 }
 
 VideoFileName = ExtractFilePath(Application->ExeName) + (*ItTEMPSeach).second;
 if(FileExists(VideoFileName))
 {
  ShellExecute(Handle, String(L"open").c_str(), VideoFileName.c_str(), NULL, NULL, SW_MAXIMIZE);
 }
 else
 {
  ShowMessage(L"Не найден видео файл " + VideoFileName + ". Программа будет закрыта.");
  Application->Terminate();
  return;
 }
 
 //тут запустим таймер анализа времени и мониторинга INI
 Timer1->Enabled = true; //период 10 секунд. Сколько тут поставить? Может 59 секунд?
 Panel1->Caption = "Сервер запущен!";
 //картинка выглядит уродиливо когда  BitBtn1->Enabled = false; поэтому:
 BitBtn1->Glyph = NULL;
 BitBtn1->Enabled = false;
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Control();
 
 if(ItTEMPSeach == NULL)
 {
  ShowMessage(L"Не найден видео файл в файле настройки. Программа будет закрыта.");
  Application->Terminate();
  return;
 }
 
String name = ExtractFilePath(Application->ExeName) + (*ItTEMPSeach).second;
 if(FileExists(name))
 {
  if(FileExists(VideoFileName) && (VideoFileName != name))
 {
  ShellExecute(Handle, String(L"open").c_str(), name.c_str(), NULL, NULL, SW_MAXIMIZE);
  VideoFileName = name;
 }
 
 HWND wnd = FindWindow(NULL, L"Проигрыватель Windows Media");
 if(wnd == NULL)
 {
  ShowMessage(L"Проигрыватель Windows Media был закрыт. Программа также будет закрыта.");
  Application->Terminate();
 }
 
 }
 else
 {
  ShowMessage(L"Не найден видео файл " + (*ItTEMPSeach).second + ". Программа будет закрыта.");
  Application->Terminate();
         }
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
 
« Последнее редактирование: 13 Апрель 2014, 14:22:01 от SilverFish » Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #11 : 13 Апрель 2014, 14:30:54 »

CodeGuard показывает такое. Все ли тут как надо?
Functions called:
 delete (130 times)
 realloc (1 times)
 memcpy (243 times)
 free (29 times)
 new (139 times)
 calloc (10 times)
 malloc (19 times)
Resource types used:
 object (139 allocs, 38 max)
 memory block (30 allocs, 19 max)
Modules used:
 00400000 04/13/2014 13:25:42 E:\VideoAndroid\.\Win32\Debug\Project1.exe
 0CD00000 06/07/2013 01:55:00 C:\Program Files (x86)\Embarcadero\RAD
 Studio\11.0\bin\CG32.DLL
 32D00000 06/07/2013 01:55:00 C:\Program Files (x86)\Embarcadero\RAD
 Studio\11.0\bin\CC32130MT.DLL
 50030000 06/07/2013 01:55:00 C:\Program Files (x86)\Embarcadero\RAD
 Studio\11.0\bin\BORLNDMM.DLL
 50050000 06/07/2013 01:55:00 C:\Program Files (x86)\Embarcadero\RAD
 Studio\11.0\bin\rtl180.bpl
 50420000 06/07/2013 01:55:00 C:\Program Files (x86)\Embarcadero\RAD
 Studio\11.0\bin\vcl180.bpl
 71550000 11/21/2010 06:24:10 C:\Windows\system32\PROPSYS.dll
 72300000 07/14/2009 04:15:14 C:\Windows\system32\dwmapi.dll
 72320000 11/21/2010 06:23:56 C:\Windows\system32\WINSTA.dll
 723C0000 07/14/2009 04:15:42 C:\Windows\system32\mpr.dll
 72400000 07/14/2009 04:11:26 C:\Windows\system32\uxtheme.dll
 727C0000 11/21/2010 06:24:16 C:\Windows\system32\apphelp.dll
 728A0000 08/27/2011 07:26:28 C:\Windows\system32\oleacc.dll
 730B0000 07/14/2009 04:16:22 C:\Windows\system32\wsock32.dll
 73650000 11/21/2010 06:23:56 C:\Windows\system32\wtsapi32.dll
 751E0000 07/14/2009 04:16:14 C:\Windows\system32\oledlg.dll
 754F0000 11/21/2010 06:23:56
 C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.
7601.17514_none_41e6975e2bd6f2b2\comctl32.dll
 756B0000 07/14/2009 04:16:16 C:\Windows\system32\SHFolder.dll
 75710000 07/14/2009 04:16:12 C:\Windows\system32\ntmarta.dll
 75740000 11/21/2010 06:24:10 C:\Windows\system32\winspool.drv
 757A0000 07/14/2009 04:16:18 C:\Windows\system32\version.dll
 75870000 07/14/2009 04:15:08 C:\Windows\syswow64\CRYPTBASE.dll
 75880000 09/25/2013 04:58:18 C:\Windows\syswow64\SspiCli.dll
 75900000 11/21/2010 06:24:02 C:\Windows\syswow64\ole32.dll
 75AA0000 07/26/2013 04:56:00 C:\Windows\syswow64\SHELL32.dll
 766F0000 11/21/2010 06:24:18 C:\Windows\syswow64\WLDAP32.dll
 76740000 07/14/2009 04:16:12 C:\Windows\syswow64\NSI.dll
 76770000 11/21/2010 06:23:52 C:\Windows\syswow64\SETUPAPI.dll
 76910000 11/21/2010 06:24:30 C:\Windows\syswow64\ADVAPI32.dll
 769B0000 08/02/2013 04:50:44 C:\Windows\syswow64\KERNELBASE.dll
 76A00000 07/14/2009 04:16:14 C:\Windows\syswow64\profapi.dll
 76A10000 03/04/2014 12:16:18 C:\Windows\syswow64\kernel32.dll
 76B20000 07/14/2009 04:16:14 C:\Windows\SysWOW64\sechost.dll
 76B40000 07/14/2009 04:15:44 C:\Windows\syswow64\MSCTF.dll
 76C70000 06/06/2013 07:57:02 C:\Windows\syswow64\LPK.dll
 76C80000 11/21/2010 06:24:22 C:\Windows\syswow64\USER32.dll
 76D80000 07/14/2009 04:15:04 C:\Windows\syswow64\CLBCatQ.DLL
 76E10000 11/21/2010 06:23:50 C:\Windows\syswow64\SHLWAPI.dll
 770A0000 07/09/2013 07:52:34 C:\Windows\syswow64\RPCRT4.dll
 77190000 12/16/2011 10:53:00 C:\Windows\syswow64\msvcrt.dll
 77250000 10/03/2013 05:00:46 C:\Windows\syswow64\GDI32.dll
 772E0000 11/21/2010 06:23:50 C:\Windows\syswow64\comdlg32.dll
 77360000 05/24/2011 13:40:06 C:\Windows\syswow64\DEVOBJ.dll
 777A0000 11/21/2010 06:24:26 C:\Windows\system32\IMM32.DLL
 77800000 08/27/2011 07:26:28 C:\Windows\syswow64\oleaut32.dll
 77890000 11/22/2012 07:45:04 C:\Windows\syswow64\USP10.dll
 77930000 11/21/2010 06:23:56 C:\Windows\syswow64\WS2_32.dll
 77970000 05/24/2011 13:39:40 C:\Windows\syswow64\CFGMGR32.dll
 779A0000 10/19/2013 04:37:00 C:\Windows\syswow64\IMAGEHLP.DLL
 77E60000 11/17/2011 08:38:40 C:\Windows\SysWOW64\ntdll.dll
==========================================
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #12 : 16 Апрель 2014, 22:20:10 »

Посетила web семинар по RAD XE6. Задала вопрос:
Will be able to use STL library (std::map, std::auto_ptr...) in Android projects in new C++Builder XE6? Thanks.

Ответ:
Yes, STL is supported in C++ for Android

Это радует. Значит по идее я могу этот проект портировать в Андроид проект?
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #13 : 16 Апрель 2014, 22:34:15 »

Хм-м...
Читая вопросы других посетителей семинара, нашла такой вопрос:
Are there differences between the C++ support in Android and the 64-bit Wiondows C++ support?

Ответ:
The only difference is the STL library, we support Dinkumware on Windows and GNU STL on Android, the language support is the same

А в чем разница между Dinkumware и GNU STL?
В GNU STL можно использовать std::map, std::auto_ptr...?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: План реализации программы
« Ответ #14 : 17 Апрель 2014, 14:04:34 »

Цитата: SilverFish от 16 Апрель 2014, 22:34:15
Хм-м...
Читая вопросы других посетителей семинара, нашла такой вопрос:
Are there differences between the C++ support in Android and the 64-bit Wiondows C++ support?

Ответ:
The only difference is the STL library, we support Dinkumware on Windows and GNU STL on Android, the language support is the same

А в чем разница между Dinkumware и GNU STL?
В GNU STL можно использовать std::map, std::auto_ptr...?

Конечно. В принципе, поддержка STL должна регламентироваться стандартами C++ (ISO/IEC 14882:2003, 2011); внешний интерфейс (классы, пространства имен) не должны зависеть от реализации. Внутренняя реализация - это уже, как говорится, другой вопрос.
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #15 : 17 Апрель 2014, 16:57:07 »

Спасибо. 
Буду пробовать портировать этот проект на Андроид устройство, но сначала попробую написать программу Hello word для Андроида. 
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: План реализации программы
« Ответ #16 : 18 Апрель 2014, 13:08:33 »

Цитата: SilverFish от 17 Апрель 2014, 16:57:07
Спасибо. 
Буду пробовать портировать этот проект на Андроид устройство, но сначала попробую написать программу Hello word для Андроида. 

Коммьюнити верит в тебя )
Записан
Tantos
А ты воспользовался поиском перед тем, как спросить?!
Давний друг


Сказали спасибо: +350/-28
Offline

Сообщений: 2181


Re: План реализации программы
« Ответ #17 : 18 Апрель 2014, 15:17:31 »

Лену - в модераторы раздела!
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #18 : 18 Апрель 2014, 16:05:31 »

Вот на эмуляторе все нормально (см.рис.).
А вот подключить к студии реальное устройство PIPO M7 пока не получилось...
Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage(L"Привет");
}
 

Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #19 : 19 Апрель 2014, 00:13:40 »

Пришел знакомый со своим старым планшетом и студия сразу его увидела. А вот мой планшет PIPO M7 никак не хотел опознаваться. Знакомый нашел рекомендацию по правке файла android_winusb.inf
http://vondroid.com/threads/usb-adb-drivers.492/#.U1GCIvl_t8F
и эта рекомендация помогла. Правда, почему то для моего планшета еще и пришлось новый adb.exe из андроид SDK заменить на более старую версию. Короче подключение моего планшета было весьма трудоемким процессом. Теперь студия видит мой планшет. Впрочем, счастье все равно не наступило - в режиме debug получаю сообщение:
Unable to start gdbserver on port 64311: Cant open socket Permission denied
В настройках планшета стоит  галочка отладки по USB. При этом программа успешно разворачивается на планшете и работает, но как победить сообщение Permission denied не понятно.

P.S.
Эти ссылки были полезными:
http://docwiki.embarcadero.com/RADStudio/XE6/en/Configuring_Your_System_to_Detect_Your_Android_Device
http://docwiki.embarcadero.com/RADStudio/XE6/en/Creating_an_Android_Emulator
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #20 : 19 Апрель 2014, 17:33:28 »

Удалось понять почему новый ADB не определял мой планшет. Ответ нашла тут:  http://digphone.ru/esli-android-adb-ne-vidit-smartfon/
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #21 : 19 Апрель 2014, 20:45:22 »

Цитировать
но как победить сообщение Permission denied не понятно

Судя по всему это проблема Google для некоторых сборок.
One comment in this from the R&D Team
"Per R&D
We took this as far as we can through workarounds, but ultimately this is a
Vendor problem with Android 4.3. Google fixed the issue in 4.4.


Итог исследований такой:
Удалось создать приложение Hello word и запустить его в режиме отладки на эмуляторе т.е. есть возможность ходит по точкам останова.
Удалось подсоединить планшет PIPO M7 Pro 4.2.2 и опознать его в студии и также запустить на нем приложение Hello word. Однако отладка с моим конкретно планшетом не работает, чтобы была возможность отладки на моем планшете его желательно прошить версией 4.4.
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #22 : 22 Апрель 2014, 17:51:03 »

Вот этот код компилируется в Андроид проекте. Пока не тестировала на реальном устройстве т.к. некоторые вопросы пока не понятны:
Код
//---------------------------------------------------------------------------
 
#include
#pragma hdrstop
 
#include
#include
#include
#include
#include
 
#include "MobUnit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
 
std::mapString, String> IniContent; //контейнер "время->имя файла"
String VideoFileName; //имя запущенного файла
std::mapString, String>::iterator ItTEMPSeach; //итератор для поиска по контейнеру map
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void Control()
{
String path = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetHomePath(), "files.ini");
 
if(FileExists(path))
{
 std::auto_ptrTIniFile> FileINI(new TIniFile(path));
 std::auto_ptrTStringList> AlliniSection(new TStringList());
 FileINI->ReadSections(AlliniSection.get());
 
  if(AlliniSection->Count == 0)
  {
ShowMessage(L"Не найдено записей в файле настройки. Программа будет закрыта.");
Application->Terminate();
return;
  }
 
 IniContent.clear();
 
 for (int i = 0; i AlliniSection->Count; i++)
 {
  IniContent[FileINI->ReadString(AlliniSection->Strings[i], L"time", "")] =
FileINI->ReadString(AlliniSection->Strings[i], L"name", "");
 }
 
 TDateTime T(Now());
 String temptime = T.TimeString();
 //вставляем в map временное значение. Поскольку map сортирует автоматом время
 //будет вставлено в правильную позицию
 IniContent[temptime] = L"TEMP";
 //устанавливаем итератор на временное значение
 ItTEMPSeach = IniContent.find(temptime);
 
 //проверим что временное значение не попало на самое первое место
 std::mapString, String>::iterator It = IniContent.begin();
 if((*It).second == L"TEMP")
 //тогда поднинемся на первое реальное значение в контейнере map
  ItTEMPSeach++;
 else
 //иначе спустимся на один итератор вниз и встанем на реальное время в контейнере map
  ItTEMPSeach--;
 
 IniContent.erase(temptime); //теперь удаляем времнное значение из map
 
}
else
{
 ShowMessage(L"Не найден файл files.ini. Программа будет закрыта.");
 Application->Terminate();
}
}
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Control();
 
 if(&ItTEMPSeach == NULL)
 {
  ShowMessage(L"Не найден видео файл в файле настройки. Программа будет закрыта.");
  Application->Terminate();
  return;
 }
 
 VideoFileName = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetHomePath(), (*ItTEMPSeach).second);
 
 if(FileExists(VideoFileName))
 {
  system(("open " + AnsiString(VideoFileName)).c_str());
 }
 else
 {
  ShowMessage(L"Не найден видео файл " + VideoFileName + ". Программа будет закрыта.");
  Application->Terminate();
  return;
 }
 
 //тут запустим таймер анализа времени и мониторинга INI
 Timer1->Enabled = true; //период 10 секунд
 Button1->Enabled = false;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Control();
 
 if(&ItTEMPSeach == NULL)
 {
  ShowMessage(L"Не найден видео файл в файле настройки. Программа будет закрыта.");
  Application->Terminate();
  return;
 }
 
 String name  = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetHomePath(), (*ItTEMPSeach).second);
 
 if(FileExists(name))
 {
  if(FileExists(VideoFileName) && (VideoFileName != name))
 {
  system(("open " + AnsiString(name)).c_str());
  VideoFileName = name;
 }
 }
 else
 {
  ShowMessage(L"Не найден видео файл " + (*ItTEMPSeach).second + ". Программа будет закрыта.");
  Application->Terminate();
         }
 
}
//---------------------------------------------------------------------------
//МОЖНО ЛИ ЗАКРЫВАТЬ ГЛАВНУЮ ФОРМУ В АНДРОИД ПРОЕКТЕ?
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled = false;
Close();
}
 

Можно ли в Андроид проекте применять Application->Terminate(); и Close() для главной формы?
Эта конструкция кажется подозрительной: if(&ItTEMPSeach == NULL) Разве нужно у итератора брать адрес?
« Последнее редактирование: 22 Апрель 2014, 17:59:14 от SilverFish » Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: План реализации программы
« Ответ #23 : 22 Апрель 2014, 19:08:52 »

Лена, вопрос на засыпку: что означает, по-твоему, проверка if(ItTEMPSeach == NULL) ? При каких, интересно, случаях, find возвращает NULL?
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #24 : 22 Апрель 2014, 19:44:09 »

Цитировать
проверка if(ItTEMPSeach == NULL)

Если файл INI кем то очищен и является пустым, то получала AV, а эта проверка это исключала.
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: План реализации программы
« Ответ #25 : 22 Апрель 2014, 21:14:32 »

Если INI-файл будет пуст, то условие if(AlliniSection->Count == 0) окажется истинным, и приложение просто завершится. Никогда iterator не будет равен NULL.

Лучше опиши Control() как функцию, возвращающую bool (или int), и проверяй результат, который она вернула (true в случае успеха, false в случае неудачи, например), чем сравнивать то, что сравнивать нельзя.
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #26 : 22 Апрель 2014, 23:45:50 »

Цитата: volvo877 от 22 Апрель 2014, 21:14:32
Если INI-файл будет пуст, то условие if(AlliniSection->Count == 0) окажется истинным, и приложение просто завершится. Никогда iterator не будет равен NULL.

Лучше опиши Control() как функцию, возвращающую bool (или int), и проверяй результат, который она вернула (true в случае успеха, false в случае неудачи, например), чем сравнивать то, что сравнивать нельзя.

Я во время выполнения программы очищала INI, или очищала имя файла в секции, я такие эксперементы проводила...

Хочу разобраться - можно чуть подробнее почему итератор нельзя сравнивать с NULL? Итератор это же указатель...
« Последнее редактирование: 23 Апрель 2014, 00:33:08 от SilverFish » Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: План реализации программы
« Ответ #27 : 23 Апрель 2014, 01:47:03 »

Покопавшись в Интернете - вроде как проверка для итератора это только или он попадает в диапазон, а на NULL итератор не проверяют. Так?
А что значит эта конструкция которая компилируется без ошибок?
if(ItTEMPSeach.operator ->() == NULL)
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


« Ответ #28 : 23 Апрель 2014, 11:33:41 »

Цитировать
Лучше опиши Control() как функцию, возвращающую bool (или int), и проверяй результат, который она вернула

Тогда так?
Код
//---------------------------------------------------------------------------
 
#include
#pragma hdrstop
 
#include
#include
#include
 
#include "UnitMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
std::mapString, String> IniContent; //контейнер "время->имя файла"
String VideoFileName; //имя запущенного файла
std::mapString, String>::iterator ItTEMPSeach; //итератор для поиска по контейнеру map
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
 
//---------------------------------------------------------------------------
bool Control()
{
String path = ExtractFilePath(Application->ExeName) + L"\\files.ini";
if(FileExists(path))
{
 std::auto_ptrTIniFile> FileINI(new TIniFile(path));
 std::auto_ptrTStringList> AlliniSection(new TStringList());
 FileINI->ReadSections(AlliniSection.get());
 
  if(AlliniSection->Count == 0)
  {
ShowMessage(L"Не найдено записей в файле настройки files.ini. Программа будет закрыта.");
return false;
  }
 
 IniContent.clear();
 
 String TIME = "";
 String NAME = "";
 for (int i = 0; i AlliniSection->Count; i++)
 {
  TIME = FileINI->ReadString(AlliniSection->Strings[i], L"time", "");
  NAME = FileINI->ReadString(AlliniSection->Strings[i], L"name", "");
  //если некоторые секции не заполнены
  if(TIME == "" || NAME  ==  "")
continue;
 
  IniContent[FileINI->ReadString(AlliniSection->Strings[i], L"time", "")] =
FileINI->ReadString(AlliniSection->Strings[i], L"name", "");
 }
 
 if(IniContent.empty())//все секции не заполнены
 {
  ShowMessage(L"Нет даннных в файле files.ini. Программа будет закрыта.");
  return false;
 }
 
 TDateTime T(Now());
 String temptime = T.TimeString();
 //вставляем в map временное значение. Поскольку map сортирует автоматом время
 //будет вставлено в правильную позицию
 IniContent[temptime] = L"TEMP";
 //устанавливаем итератор на временное значение
 ItTEMPSeach = IniContent.find(temptime);
 
 //проверим что временное значение не попало на самое первое место
 std::mapString, String>::iterator It = IniContent.begin();
 if((*It).second == L"TEMP")
 //тогда поднинемся на первое реальное значение в контейнере map
  ItTEMPSeach++;
 else
 //иначе спустимся на один итератор вниз и встанем на реальное время в контейнере map
  ItTEMPSeach--;
 
 IniContent.erase(temptime); //теперь удаляем времнное значение из map
 
}
else
{
 ShowMessage(L"Не найден файл files.ini. Программа будет закрыта.");
 return false;
}
 
return true;
}
 
//---------------------------------------------------------------------------
//СТАРТ
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
 
if(!Control())
{
 Application->Terminate();
 return;
}
 
 VideoFileName = ExtractFilePath(Application->ExeName) + (*ItTEMPSeach).second;
 if(FileExists(VideoFileName))
 {
  ShellExecute(Handle, String(L"open").c_str(), VideoFileName.c_str(), NULL, NULL, SW_MAXIMIZE);
 }
 else
 {
  ShowMessage(L"Не найден видео файл " + VideoFileName + ". Программа будет закрыта.");
  Application->Terminate();
  return;
 }
 
 //тут запустим таймер анализа времени и мониторинга INI
 Timer1->Enabled = true; //период 30 секунд
 Panel1->Caption = "Сервер запущен!";
 //моя картинка выглядит уродиливо когда  BitBtn1->Enabled = false; поэтому:
 BitBtn1->Glyph = NULL;
 BitBtn1->Enabled = false;
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(!Control())
{
 Application->Terminate();
 return;
}
 
 
 String name = ExtractFilePath(Application->ExeName) + (*ItTEMPSeach).second;
 if(FileExists(name))
 {
  if(FileExists(VideoFileName) && (VideoFileName != name))
 {
  ShellExecute(Handle, String(L"open").c_str(), name.c_str(), NULL, NULL, SW_MAXIMIZE);
  VideoFileName = name;
 }
 
 }
 else
 {
  ShowMessage(L"Не найден видео файл " + (*ItTEMPSeach).second + ". Программа будет закрыта.");
  Application->Terminate();
         }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
 
« Последнее редактирование: 23 Апрель 2014, 11:42:58 от SilverFish » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.131 секунд. Запросов: 20.